Hive on Spark列出特定配置单元表的所有分区并添加分区

Dav*_*d H 4 hive apache-spark

我正在使用spark 2.0,我想知道,是否有可能列出特定蜂巢表的所有文件?如果是这样,我可以使用spark直接逐步更新这些文件sc.textFile("file.orc") .如何在hive表中添加新分区?我可以从火花中使用蜂巢状的Metast?

有没有办法获得映射数据帧的内部配置单元功能 row => partition_path

我的主要推理是表的增量更新.现在我唯一想到的方法是FULL OUTER JOINSQL + SaveMode.Overwrite,这不是那么有效,因为他会覆盖所有表,而我的主要兴趣是某些特定分区的增量更新/添加新分区

从我在HDFS上看到的编辑,当SaveMode.Overwrite spark将发出表定义即CREATE TABLE my_table .... PARTITION BY (month,..).spark将所有文件置于其下$HIVE/my_table并且不在其下$HIVE/my_table/month/...,这意味着他没有对数据进行分区.当我写的时候,我df.write.partitionBy(...).mode(Overwrite).saveAsTable("my_table")在hdfs上看到它是正确的.我用过,SaveMode.Overwrite因为我正在更新记录而不是附加数据.

我加载数据使用spark.table("my_table")这意味着火花懒惰加载表是一个问题,因为我不想加载所有表只是if的一部分.

对于这个问题:

1.由于我已经使用过partitionBy(),所以火花会改变数据,或者他会比较当前的分区,如果它相同,他就不会对数据进行混洗.

2.当从数据中改变部分时(即仅针对特定的月/年),并且应用该更改而不是加载所有数据时,是否足够聪明地使用分区修剪?(FULL OUTER JOIN基本上是扫描所有表格的操作)

Vla*_*cak 7

添加分区:

可以使用针对非流式传输或用于流式传输数据的partitionBy提供来完成从spark添加分区.DataFrameWriterDataStreamWriter

public DataFrameWriter<T> partitionBy(scala.collection.Seq<String> colNames)
Run Code Online (Sandbox Code Playgroud)

所以如果你想分区数据year,那么monthspark会将数据保存到文件夹,如:

year=2016/month=01/
year=2016/month=02/
Run Code Online (Sandbox Code Playgroud)

您已经提到过orc- 您可以将保存用作以下orc格式:

df.write.partitionBy('year', 'month').format("orc").save(path)
Run Code Online (Sandbox Code Playgroud)

但你可以很容易插入蜂巢表,如:

df.write.partitionBy('year', 'month').insertInto(String tableName)
Run Code Online (Sandbox Code Playgroud)

获取所有分区:

Spark sql基于配置单元查询语言,因此您可以使用它SHOW PARTITIONS来获取特定表中的分区列表.

sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")
Run Code Online (Sandbox Code Playgroud)

只需确保.enableHiveSupport()在创建会话时有SparkSessionBuilder,并确保是否已正确配置hive-conf.xml


小智 5

在使用scala的spark中,我们可以使用目录来获取分区:

spark.catalog.listColumns(<databasename>, <tablename>)
.filter($"isPartition" === true)
.select($"name").collect()
Run Code Online (Sandbox Code Playgroud)

  • 这只会给出分区列名称,而不给出值本身。 (2认同)