#apache-spark #apache-spark-sql
Вопрос:
Предположим, у меня есть ряд кадров данных, соединенных вместе с немного разными наборами столбцов
df1.join(df2, Seq("order_id", "customer_id"))
.join(df3, Seq("order_id"))
.join(df3, Seq("order_id", "month"))
...
Все соединения включают order_id
, но некоторые соединения включают и другие столбцы.
Теперь, если order_id
мощность намного выше, чем у других столбцов, имело бы смысл разбить все на order_id
разделы, чтобы мы не перетасовывали другие результаты в разных комбинациях customer_id
и month
.
есть ли способ заставить Искру оставить все разделенным customer_id
наедине?
Ответ №1:
В отношении:
есть ли способ заставить Искру оставить все разделенным
customer_id
наедине?
Нет, нет, это не так, как работает Искра. В принципе, левая и правая стороны соединения должны быть (повторно)разделены с использованием одного и того же разделителя и выполнены в наборах соединений.
Запуск .explain
приложения покажет это. Это не база данных ORACLE.
Вот хорошее чтение о соединениях и эффектах перетасовки: https://towardsdatascience.com/the-art-of-joining-in-spark-dcbd33d693c
val res = df1.join(df2, Seq("order_id", "firstname")).join(df3, Seq("order_id"))
res.explain(true)
раскрывается:
Как вы можете видеть, для каждой пары СОЕДИНЕНИЙ есть определенные шаги.