Apache spark 在Spark中读取/写入带扣表格

Apache spark 在Spark中读取/写入带扣表格,apache-spark,hive,parquet,Apache Spark,Hive,Parquet,我有很多表(有1亿行),它们存储为使用拼花格式的外部蜂巢表。Spark作业需要使用一个列将其中几个连接在一起,几乎不进行过滤。联接列的唯一值比行数少约2/3倍 我可以看到,有洗牌发生的加入键;我一直在尝试利用bucketing/分区来提高连接性能。我的想法是,如果Spark能够意识到这些表中的每一个都使用了相同的列进行了绑定,那么它就可以加载数据帧,并在不混乱的情况下连接它们。我试过使用蜂巢扣,但洗牌不会消失。(从Spark的文档中可以看出,至少从Spark 2.3.0开始不支持蜂巢扣合,我后来

我有很多表(有1亿行),它们存储为使用拼花格式的外部蜂巢表。Spark作业需要使用一个列将其中几个连接在一起,几乎不进行过滤。联接列的唯一值比行数少约2/3倍

我可以看到,有洗牌发生的加入键;我一直在尝试利用bucketing/分区来提高连接性能。我的想法是,如果Spark能够意识到这些表中的每一个都使用了相同的列进行了绑定,那么它就可以加载数据帧,并在不混乱的情况下连接它们。我试过使用蜂巢扣,但洗牌不会消失。(从Spark的文档中可以看出,至少从Spark 2.3.0开始不支持蜂巢扣合,我后来发现了这一点。)我可以使用Spark的扣合功能来实现这一点吗?如果是,我是否必须禁用配置单元支持并直接读取文件?或者我可以使用Spark的bucketing方案重写一次表,然后仍然能够将它们作为蜂巢表来读取吗

编辑:为了写出带蜂巢扣的表格,我使用了如下方法:

customerDF
.write
.option("path", "/some/path")
.mode("overwrite")
.format("parquet")
.bucketBy(200, "customer_key")
.sortBy("customer_key")
.saveAsTable("table_name")
写作部分似乎起作用了。然而,从两张这样写的表格中阅读并把它们连接起来并没有像我预期的那样有效。也就是说,Spark将两个表重新划分为200个分区


我现在没有执行Spark bucketing的代码,但如果我弄明白了,将进行更新。

您是在Spark上使用dataframe api还是运行hive ql?请加一些code@TahaNaqvi添加了一些代码。