首页 > 解决方案 > 通过 sparkSQL 进行 Hive 分桶

问题描述

我对蜂巢中的桶存有疑问。我创建了一个临时表,它存储在列键上。

通过 spark SQL,我将数据插入到这个临时表中。我在 spark 会话中启用了 hive.enforce.bucketing 为 true。

当我检查此表的基目录时,它显示以 part_* 为前缀的文件名。

但是,当我通过另一个表手动将数据插入该表时,我看到了前缀为 00000_* 的文件。

我不确定 spark sql 是否正在将数据写入存储桶中。

有人可以帮忙吗。

谢谢,

标签: apache-sparkhiveapache-spark-sqldata-processing

解决方案


一个令人困惑的领域。

我前段时间发现了这个:

但是,从 Spark 2.3 开始支持 Hive 分桶表。Spark 通常不允许用户将输出写入 Hive Bucketed 表。设置hive.enforce.bucketing=false并将hive.enforce.sorting=false允许您保存到 Hive Bucketed 表。

在 Spark 的 JIRA 中:https ://issues.apache.org/jira/browse/SPARK-17729

Hive 允许在不保证基于这两个配置的分桶和排序的情况下将数据插入到分桶表中:hive.enforce.bucketinghive.enforce.sorting.

有了这个 jira,Spark 仍然不会按照 Hive 的分桶保证生成分桶数据,但将允许写入 IFF 用户希望这样做而不关心分桶保证。创建分桶表的能力将允许在将片段添加到 Spark 时将测试用例添加到 Spark,使其支持 hive 分桶(例如https://github.com/apache/spark/pull/15229

但从权威来源 https://spark.apache.org/docs/latest/sql-migration-guide-hive-compatibility.html#unsupported-hive-functionality 以下:

不支持的 Hive 功能 以下是我们尚不支持的 Hive 功能列表。大多数这些功能很少在 Hive 部署中使用。带有桶的主要 Hive 功能表:桶是 Hive 表分区内的哈希分区。Spark SQL 还不支持存储桶。

所以要回答你的问题:你得到了 Hive Bucketing 的 Spark 方法,这是一个近似值,因此并不是一回事。


推荐阅读