通过sparkSQL进行配置单元存储

时间:2018-08-02 13:25:21

标签: hive apache-spark-sql

我对配置单元中的存储存有疑问。我创建了一个临时表,存储在列键中。 通过spark SQL,我正在将数据插入此临时表中。我已在saprk会话中将hive.enforce.bucketing启用为true。当我检查此表的基本目录时, 它显示以part_ 为前缀的文件名。 但是,当我通过另一个表手动将数据插入该表时,  我看到文件的前缀为00000 _ 。 我不确定spark sql是否将数据写入存储桶中。有人可以帮忙吗。

谢谢

2 个答案:

答案 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=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的同时支持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尚不支持存储桶。

因此回答您的问题:您正在采用Spark方法进行Hive Bucketing,这是一个近似值,因此并不是一回事。