我有许多表(有1亿行)使用parquet格式存储为外部配置单元表。spark作业需要使用一个列将它们中的几个连接在一起,几乎没有过滤。联接列的唯一值大约比行数少2/3倍。
我可以看到,有洗牌发生的连接键;我一直在尝试利用bucketing/分区来提高连接性能。我的想法是,如果spark能够意识到这些表中的每一个表都使用了相同的列进行了绑定,那么它就可以加载Dataframe并将它们连接起来,而无需洗牌。我试过使用Hive扣,但洗牌不会消失(从spark的文档来看,至少从spark 2.3.0开始,配置单元bucketing是不受支持的,我后来发现了这一点。)我可以使用spark的bucketing功能来实现这一点吗?如果是,我是否必须禁用配置单元支持并直接读取文件?或者我可以用spark的bucketing方案重写一次表,并且仍然能够将它们作为配置单元表来读取吗?
编辑:为了写出Hive扣表,我使用了如下方法:
customerDF
.write
.option("path", "/some/path")
.mode("overwrite")
.format("parquet")
.bucketBy(200, "customer_key")
.sortBy("customer_key")
.saveAsTable("table_name")
写作部分似乎起作用了。然而,从两个这样写的表中读取并连接它们并没有像我预期的那样起作用。也就是说,spark将两个表重新划分为200个分区。
我没有代码做Spark扣现在,但会更新,如果我发现它。
暂无答案!
目前还没有任何答案,快来回答吧!