我对配置单元中的存储存有疑问。我创建了一个临时表,存储在列键中。 通过spark SQL,我正在将数据插入此临时表中。我已在saprk会话中将hive.enforce.bucketing启用为true。当我检查此表的基本目录时, 它显示以part_ 为前缀的文件名。 但是,当我通过另一个表手动将数据插入该表时, 我看到文件的前缀为00000 _ 。 我不确定spark sql是否将数据写入存储桶中。有人可以帮忙吗。
谢谢
答案 0 :(得分:1)
虽然Spark(至少在版本== 2.4中)不直接支持Hive的存储桶格式,但可以通过使用SparkSQL将数据加载到Hive中,使Spark输出Hive可读的存储桶数据表格:
//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")
答案 1 :(得分:0)
一个令人困惑的区域。
我前些时候发现的:
但是,从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.bucketing
和hive.enforce.sorting
这两个配置的存储桶和排序顺序。
使用此jira,Spark仍然不会按照Hive的存储保证来生成存储的数据,但是允许IFF用户希望这样做的写入而不必关心存储保证。具有创建存储桶表的功能,可以在将测试用例添加到Spark的同时支持Hive存储桶(例如https://github.com/apache/spark/pull/15229)来添加测试用例
不受支持的Hive功能 以下是我们尚不支持的Hive功能列表。这些功能中的大多数很少在Hive部署中使用。 蜂巢的主要功能 带存储桶的表:存储桶是Hive表分区内的哈希分区。 Spark SQL尚不支持存储桶。
因此回答您的问题:您正在采用Spark方法进行Hive Bucketing,这是一个近似值,因此并不是一回事。