我在连接两个表时使用了Bucketing,但是交换仍在进行。我不确定自己在做什么错。
我经历过-https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-bucketing.html和其他各种有关存储的博客。
我已验证以下内容-
bucketedTable1.queryExecution.toRdd.getNumPartitions bucketedTable1.queryExecution.toRdd.getNumPartitions
以上两个查询均得出1000。
HashPartitioning分区方案正在使用。
我正在基于用于存储分区的相同键来联接表。
我已确认启用了存储桶
spark.sessionState.conf.bucketingEnabled结果为true。
val table1 = sql("select * from table1")
val table2 = sql("select * from table2")
table1.write.bucketBy(1000, "col1", "col2", "col3", "col4").mode(SaveMode.Overwrite).saveAsTable("table1BucketedTableName")
table2.write.bucketBy(1000, "col5", "col6", "col3", "col4").mode(SaveMode.Overwrite).saveAsTable("table2BucketedTableName")
val bucketedTable1 = spark.table("table1BucketedTableName")
val bucketedTable2 = spark.table("table2BucketedTableName")
val joinedTable = bucketedTable1.join(bucketedTable2, bucketedTable1("col1") === bucketedTable2("col5") && bucketedTable1("col2") === bucketedTable2("col6") && bucketedTable1("col3") === bucketedTable2("col3") && bucketedTable1("col4") === bucketedTable2("col4"))
joinedTable.show(false)
预期输出是不应该进行交换。
但是当我检查Spark UI时,可以看到交换的发生。