我正在使用spark 2.0,我想知道,是否有可能列出特定蜂巢表的所有文件?如果是这样,我可以使用spark sc.textFile("file.orc")
直接逐步更新这些文件 . 如何在hive表中添加新分区?我可以从火花中使用蜂巢状的Metast?
有没有办法获得映射数据帧的内部hive函数 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基本上是扫描所有表格的操作)
1 回答
Adding partitions:
可以使用
DataFrameWriter
中提供的partitionBy(对于非流式传输)或使用DataStreamWriter
(对于流式数据)来添加来自spark的分区 .所以如果你想通过
year
和month
分区数据,spark会将数据保存到文件夹,如:您已经提到orc - 您可以将保存用作
orc
格式:但你可以很容易插入蜂巢表,如:
Getting all partitions:
Spark sql基于hive查询语言,因此您可以使用SHOW PARTITIONS获取特定表中的分区列表 .
只需确保在使用 SparkSessionBuilder 创建会话时
.enableHiveSupport()
并确保是否正确配置了hive-conf.xml etc.