我正在使用spark 2.0,我想知道,是否可以列出特定配置单元表的所有文件?如果是这样,我可以直接使用spark增量更新这些文件 sc.textFile("file.orc")
. 如何向配置单元表添加新分区?在配置单元元存储上有我可以从spark使用的api吗?
有没有办法得到MapDataframe的内部配置单元函数 row => partition_path
我的主要理由是表的增量更新。现在我唯一能想到的是 FULL OUTER JOIN
sql语句+ SaveMode.Overwrite
,这不是很有效,因为他将覆盖所有表,而我的主要兴趣是一些特定分区的增量更新/添加新分区
当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")
这意味着spark懒散地加载表,这是一个问题,因为我不想加载所有的表只是if的一部分。
对于这个问题:
1.spark会因为我使用了 partitionBy()
,或者他比较当前分区,如果相同,他将不洗牌数据。
2.spark是否足够聪明,可以在从数据中变异部分(即仅针对特定月份/年份)时使用分区修剪,并应用该更改而不是加载所有数据(完全外部连接基本上是扫描所有表的操作)
2条答案
按热度按时间7hiiyaii1#
添加分区:
从spark添加分区可以用
partitionBy
提供于DataFrameWriter
对于非流式或带DataStreamWriter
对于流数据。所以如果你想用
year
以及month
spark会将数据保存到如下文件夹:你提到过
orc
-您可以使用保存作为orc
格式:但您可以很容易地插入到配置单元表中,如:
获取所有分区:
spark sql基于配置单元查询语言,因此您可以使用
SHOW PARTITIONS
获取特定表中的分区列表。一定要有
.enableHiveSupport()
创建会话时SparkSessionBuilder
还要确定你是否hive-conf.xml
等配置正确xuo3flqw2#
在使用scala的spark中,我们可以使用目录来获取分区: