通过 sparkSQL 进行 Hive 分桶

Posted

技术标签:

【中文标题】通过 sparkSQL 进行 Hive 分桶【英文标题】:Hive bucketing through sparkSQL 【发布时间】:2018-08-02 13:25:21 【问题描述】:

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

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

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

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

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

有人可以帮忙吗。

谢谢,

【问题讨论】:

你能展示你使用的代码吗? 【参考方案1】:

一个令人困惑的区域。

我前段时间发现了这个:

但是,从 Spark 2.3 开始支持 Hive 分桶表。 Spark 通常不允许用户将输出写入 Hive Bucketed 表。设置 hive.enforce.bucketing=falsehive.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 表分区内的哈希分区。 Spark SQL 还不支持存储桶。

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

【讨论】:

【参考方案2】:

虽然 Spark(至少在版本

//enable Hive support when creating/configuring the spark session
val spark = SparkSession.builder().enableHiveSupport().getOrCreate()

//register DF as view that can be used with SparkSQL
val testDF = Seq((1, "a"),(2, "b"),(3, "c")).toDF("number", "letter")
testDF.createOrReplaceTempView("testDF")

//create Hive table, can also be done manually, e.g. via Hive CLI
val createTableSQL = "CREATE TABLE testTable (number int, letter string) CLUSTERED BY number INTO 1 BUCKETS STORED AS PARQUET"
spark.sql(createTableSQL)

//load data from DF into Hive, output parquet files will be bucketed and readable by Hive
spark.sql("INSERT INTO testTable SELECT * FROM testDF")

【讨论】:

这为我返回(在 spark 2.3.0.2 中):“输出 Hive 表 ”已分桶,但 Spark 当前不填充与 Hive 兼容的分桶输出。;'有什么需要配置的吗?

以上是关于通过 sparkSQL 进行 Hive 分桶的主要内容,如果未能解决你的问题,请参考以下文章

Hive 教程-分区表与分桶表

Hive - 分桶和分区

在 Hive 中对表进行分区和分桶有啥区别?

Hive分桶操作(Bucket)一图掌握核心内容

Hive的分区和分桶

未在 Hive 中优化分桶