如何避免在分区列上的SortMerge Join中乱序?

时间:2019-03-28 17:10:05

标签: apache-spark apache-spark-sql

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

数据集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)); 

加入区域和studentId会导致数据混排。下面是联接查询:

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

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

1 个答案:

答案 0 :(得分:0)

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