spark上的配置单元列出特定配置单元表的所有分区并添加一个分区

tuwxkamq  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(412)

我正在使用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是否足够聪明,可以在从数据中变异部分(即仅针对特定月份/年份)时使用分区修剪,并应用该更改而不是加载所有数据(完全外部连接基本上是扫描所有表的操作)

7hiiyaii

7hiiyaii1#

添加分区:
从spark添加分区可以用 partitionBy 提供于 DataFrameWriter 对于非流式或带 DataStreamWriter 对于流数据。

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

所以如果你想用 year 以及 month spark会将数据保存到如下文件夹:

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

你提到过 orc -您可以使用保存作为 orc 格式:

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

但您可以很容易地插入到配置单元表中,如:

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

获取所有分区:
spark sql基于配置单元查询语言,因此您可以使用 SHOW PARTITIONS 获取特定表中的分区列表。

sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")

一定要有 .enableHiveSupport() 创建会话时 SparkSessionBuilder 还要确定你是否 hive-conf.xml 等配置正确

xuo3flqw

xuo3flqw2#

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

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

相关问题