我有两个表都聚集在同一列上,但是在将两个表连接到聚集列上时,执行计划同时显示了交换和排序步骤。
两个表都存储在同一列(key_column)上。这两个表都是或压缩的,表A进行了分区和存储,表B进行了存储在同一列上。
我想避免计划中的排序和交换步骤,而根据文档,存储桶表应该避免排序和交换步骤。
我甚至尝试了以下蜂巢属性:
spark.sql('set spark.sql.orc.filterPushdown=true')
spark.sql('set hive.optimize.bucketmapjoin = true')
spark.sql('set hive.optimize.bucketmapjoin.sortedmerge = true')
spark.sql('set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat')
spark.sql('set hive.optimize.bucketmapjoin = true')
spark.sql('set hive.stats.autogather=true')
spark.sql('set hive.compute.query.using.stats=true')
spark.sql('set hive.optimize.index.filter=true')
also collected stats for the tables:
排序和交换都可以在物理计划中看到,但配置分区的表应该避免排序和交换步骤
[count#1311L])
+- *Project
+- *SortMergeJoin [key_column#1079], [key_column#1218],Inner
sort step: :- *Sort [key_column#1079 ASC NULLS FIRST], false, 0
exchange step: : +- Exchange hashpartitioning(key_column#1079, 200)
: +- *Filter isnotnull(key_column#1079)
预期结果: 没有排序和交换
[count#1311L])
+- *Project
+- *SortMergeJoin [key_column#1079], [key_column#1218], Inner
: +- *Filter isnotnull(key_column#1079)`enter code here`
我想避免计划中的排序和交换步骤,而根据文档,存储桶表应该避免排序和交换步骤。
答案 0 :(得分:0)
Hive和Spark的存储桶语义不同。
在Spark中读取从Hive创建的存储桶表时,将不遵守Hive存储桶语义。
要利用Spark存储桶功能,必须使用Spark创建表。
来自开放源代码的设计文档,详细介绍了Hive和Spark存储桶之间的区别:https://docs.google.com/document/d/1a8IDh23RAkrkg9YYAeO51F4aGO8-xAlupKwdshve2fc/edit#heading=h.fbzz4lt51r0