Физические джойны в Spark - keslota/hadoop_tips GitHub Wiki
Как Spark выбирает механизм Join? Рассмотрев важные аспекты операции Join и различные механизмы выполнения Join, давайте теперь посмотрим, как Spark выбирает тот или иной механизм:
Spark выбирает конкретный механизм для выполнения операции Join, основываясь на следующих факторах:
Параметры конфигурации
Подсказки для Join
Размер наборов входных данных
Тип Join
Эквивалентные или неэквивалентные джойны (Equi or Non-Equi Join)
Spark обеспечил гибкость в API Join для указания дополнительных подсказок Join с целью завершения механизма Join. Подсказки Join, такие как 'broadcast', 'merge', 'shuffle_hash' и 'shuffle_replicate_nl', могут быть предоставлены вместе с наборами данных, принимающими участие в Join.
Ниже приводится полное описание того, как Spark выбирает различные механизмы Join с учетом вышеперечисленных факторов:
'Broadcast Hash Join' Обязательные условия
Применимо только к условию Equi Join
Не применимо к типу соединения 'Full Outer' Join
Помимо обязательного условия, одно из следующих условий должно быть истинным:
Для левого набора входных данных предоставлена подсказка 'Broadcast', а тип Join - 'Right Outer', 'Right Semi' или 'Inner'.
Подсказка не предоставлена, но левый входной набор данных является широковещательным согласно конфигурации 'spark.sql.autoBroadcastJoinThreshold (по умолчанию 10 МБ)' и тип Join - 'Right Outer', 'Right Semi', or 'Inner'.
Предоставлена подсказка 'Broadcast' для правого набора входных данных, а тип Join - 'Left Outer', 'Left Semi' или 'Inner'.
Подсказка не предоставляется, но правый входной набор данных является широковещательным согласно конфигурации 'spark.sql.autoBroadcastJoinThreshold (по умолчанию 10 МБ)' и тип Join - 'Left Outer', 'Left Semi', or 'Inner'.
Предоставлена подсказка 'Broadcast' для обоих наборов входных данных, а тип Join - 'Left Outer', 'Left Semi', 'Right Outer', 'Right Semi' или 'Inner'.
Подсказка не предоставляется, но оба входных набора данных являются широковещательными согласно конфигурации 'spark.sql.autoBroadcastJoinThreshold (по умолчанию 10 МБ)' и тип Join - 'Left Outer', 'Left Semi', 'Right Outer', 'Right Semi' или 'Inner'.
'Shuffle Hash Join' Обязательные условия
Применимо только к условию Equi Join
Не применимо к типу соединения 'Full Outer' Join
Конфигурация 'spark.sql.join.prefersortmergeJoin (по умолчанию true)' имеет значение false
Помимо обязательного условия, одно из следующих условий должно быть истинным:
Предоставлена подсказка 'shuffle_hash' для левого набора входных данных, а тип Join - 'Right Outer', 'Right Semi', или 'Inner'.
Подсказка не предоставляется, но левый входной набор данных значительно меньше правого входного набора данных, а тип Join - 'Right Outer', 'Right Semi' или 'Inner'.
Подсказка 'shuffle_hash' предоставлена для правого набора входных данных, а тип Join - 'Left Outer', 'Left Semi', или 'Inner'.
Подсказка не предоставляется, но правый входной набор данных значительно меньше левого, а тип Join - 'Left Outer', 'Left Semi', или 'Inner'.
Подсказка 'shuffle_hash' предоставлена для обоих входных наборов данных, а тип Join - 'Left Outer', 'Left Semi', 'Right Outer', 'Right Semi', или 'Inner'.
Подсказка не предоставляется, но оба набора данных существенно малы, а тип Join - 'Left Outer', 'Left Semi', 'Right Outer', 'Right Semi', или 'Inner'.
'Sort Merge Join' Обязательные условия
Применимо только к условию Equi Join
Ключи Join Keys, определенные из условия Equi Join, поддаются сортировке
Конфигурация 'spark.sql.join.prefersortmergeJoin (по умолчанию true)' имеет значение true.
Помимо обязательных условий, одно из следующих условий должно быть истинным:
Подсказка 'merge' предоставляется для любого набора входных данных, а тип Join может быть любым.
Подсказка не предоставлена, а тип Join может быть любым.
'Cartesian Join' Обязательные условия
Тип соединения 'Inner'
Помимо обязательного условия, должно выполняться одно из следующих условий:
Подсказка 'shuffle_replicate_nl' предоставлена для любого из входных наборов данных, условие Join может быть Equi или Non-Equi.
Подсказка не предоставлена, условие Join может быть Equi или Non-Equi.
'Broadcast Nested Loop Join' 'Broadcast Nested Loop Join' - является механизмом Join по умолчанию; когда нельзя выбрать другие механизмы, тогда 'Broadcast Nested Loop Join' выбирается как окончательный механизм для выполнения любого типа Join для любого условия Join.
В случае, если более одного механизма Join становятся пригодными для выполнения, тогда выбирается предпочтительный в следующем порядке 'Broadcast Hash Join', 'Sort Merge Join', 'Shuffle Hash Join', 'Cartesian Join'.
Среди Cartesian и Broadcast Nested Loop Join, Broadcast Nested Loop предпочтительнее для Inner, Non-Equi Joins, чем Cartesian Join, в случае, когда один из входных наборов данных может быть транслирован.