首页 > 解决方案 > 如何避免在分区列上的 SortMerge Join 中洗牌?

问题描述

我们得到了两个持久化的数据集,如下所示:

数据集 A:

datasetA.repartition(5, datasetA.col("region")) 
                .write().mode(saveMode) 
                .format("parquet") 
                .partitionBy("region") 
                .bucketBy(5,"studentId") 
                .sortBy("studentId") 
                .option("path", parquetFilesDirectory) 
                .saveAsTable( database.tableA)); 

数据集 B:

datasetB.repartition(5, datasetB.col("region")) 
                .write().mode(saveMode) 
                .format("parquet") 
                .partitionBy("region") 
                .bucketBy(5,"studentId") 
                .sortBy("studentId") 
                .option("path", parquetFilesDirectory) 
                .saveAsTable( database.tableB)); 

加入 region 和 studentId 会导致数据洗牌。下面是连接查询:

spark.sql("Select count(*)  from  database.tableA a, database.tableB b where a.studentId = b.studentId and a.region = b.region").show() 

当我们包含分区键时,洗牌的原因可能是什么?我们如何减轻它?

标签: apache-sparkapache-spark-sql

解决方案


是的,您可以使用预排序和分组表来减轻 Shuffle


推荐阅读