通过sparksql的hive bucketing

wqnecbli  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(505)

我有一个关于Hive里的扣子的疑问。我已经创建了一个临时表,它被扣在列键上。
通过sparksql,我将数据插入到这个临时表中。我已在spark会话中将hive.enforce.bucketing启用为true。
当我检查这个表的基本目录时,它显示了前缀为part.*的文件名。
但是,当我通过另一个表手动将数据插入这个表时,我看到前缀为00000的文件。
我不确定sparksql是否在用桶写数据。
有人能帮忙吗。
谢谢,

myss37ts

myss37ts1#

令人困惑的地方。
不久前我发现了这个:
不过,从spark 2.3开始,Hive扣表就得到了支持。spark通常不允许用户将输出写入配置单元的表。设置 hive.enforce.bucketing=false 以及 hive.enforce.sorting=false 将允许您保存到Hive扣表。
在spark's jira中:https://issues.apache.org/jira/browse/spark-17729
hive允许将数据插入到bucketed表,而不保证基于以下两种配置的bucketed和sorted: hive.enforce.bucketing 以及 hive.enforce.sorting .
有了这个jira,spark仍然不会按照hive的bucketing保证生成bucketed数据,但是如果用户希望这样做的话,它将允许写入,而不必关心bucketing保证。创建带扣表的能力将允许在向spark添加工件时向spark添加测试用例,并使其支持配置单元带扣(例如。https://github.com/apache/spark/pull/15229)
但从确切的来源来看https://spark.apache.org/docs/latest/sql-migration-guide-hive-compatibility.html#unsupported-配置单元功能包括:
下面不支持的配置单元功能是我们还不支持的配置单元功能的列表。这些特性中的大多数很少在配置单元部署中使用。主要配置单元具有带bucket的表:bucket是配置单元表分区中的哈希分区。sparksql还不支持bucket。
所以要回答你的问题:你得到的是一个近似的Hive扣的Spark方法,因此实际上不是一回事。

yftpprvb

yftpprvb2#

虽然spark(至少在版本<=2.4中)不直接支持hive的bucketing格式,但是可以通过使用sparksql将数据加载到hive表中,让spark输出hive可读的Bucked数据:

//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")

相关问题