просто дополнение к ранее хорошим ответам.Если вы несколько раз объединяете большой фрейм данных в своем приложении pyspark, сохраните эту таблицу в виде таблиц с пакетами и прочитайте их обратно в pyspark как фрейм данных.таким образом, вы можете избежать нескольких перемешиваний во время объединения, так как данные уже предварительно перемешаны и отсортированы.
, поэтому, когда Spark выбирает сортировку слиянием и объединением на двух больших фреймах данных, он пропускает фазу сортировки и перемешивания во время операций объединения.(Вы можете подтвердить это в пользовательском интерфейсе spark, глядя на wholecodegen)
df_data_1.coalesce(1).write.format('orc').bucketBy(20, 'joincolumn').sortBy("sortcolumn").mode("overwrite").saveAsTable('bucketed_table1')
df_data_2.coalesce(1).write.format('orc').bucketBy(20, 'joincolumn').sortBy("sortcolumn").mode("overwrite").saveAsTable('bucketed_table2')
df_bucket_table_1 = spark.table("bucketed_table1");
df_bucket_table_2 = spark.table("bucketed_table2");
spark.conf.set("spark.sql.autoBroadcastJoinThreshold", -1)
spark.conf.set("spark.sql.join.preferSortMergeJoin","true")
#creating alias for the dataframes:
from pyspark.sql.functions import *
df1 = df_bucket_table_1.alias('df1')
df2 = df_bucket_table_2.alias('df2')
DfInnerJoin = df1.join(df2, df1.joincolumn == df2.joincolumn,'inner').select('df1.*')
Приведенное выше объединение не будет тасоваться, но это полезно только в том случае, если вам необходимо присоединиться к одному и тому же фрейму данных по всему приложению несколько раз.