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

时间:2016-10-26 16:49:10

标签: apache-spark hive

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

有没有办法获得映射数据框row => partition_path

的内部配置单元功能

我的主要推理是表的增量更新。现在我唯一想到的方法是FULL OUTER JOIN SQL + 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基本上是扫描所有表的操作)

2 个答案:

答案 0 :(得分:7)

添加分区:

可以使用DataFrameWriter中为非流式传输提供partitionBy或使用DataStreamWriter为流式数据添加来自spark的分区。

public DataFrameWriter<T> partitionBy(scala.collection.Seq<String> colNames)

因此,如果您想按yearmonth对数据进行分区,则会将数据保存到文件夹,如:

year=2016/month=01/
year=2016/month=02/

您提到了orc - 您可以将保存用作orc格式:

df.write.partitionBy('year', 'month').format("orc").save(path)

但您可以轻松地插入到hive表中,如:

df.write.partitionBy('year', 'month').insertInto(String tableName)

获取所有分区:

Spark sql基于hive查询语言,因此您可以使用SHOW PARTITIONS获取特定表中的分区列表。

sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")

使用 .enableHiveSupport() 创建会话时,请务必确保SparkSessionBuilder,并确保您是否正确配置了hive-conf.xml etc.

答案 1 :(得分:-1)

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

**/home/sahilra/Desktop/DOcs/Web_Dev/git_projects ** ssh-add ~/.ssh/id_rsa
Could not add identity "/home/mobaxterm/.ssh/id_rsa": agent refused operation