gpt4 book ai didi

apache-spark - Hive on Spark 列出特定 Hive 表的所有分区并添加一个分区

转载 作者:行者123 更新时间:2023-12-04 04:15:10 26 4
gpt4 key购买 nike

我正在使用 spark 2.0,我想知道是否可以列出特定配置单元表的所有文件?如果是这样,我可以直接使用 spark sc.textFile("file.orc")
增量更新这些文件.
如何向配置单元表添加新分区?我可以从spark使用hive Metastore上的任何api吗?

有什么办法可以得到映射数据帧的内部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") 加载数据这意味着 spark 懒惰地加载表,这是一个问题,因为我不想加载所有表只是 if 的一部分。

对于这个问题:

1.我用过partitionBy(),所以spark会打乱数据吗? , 或者他比较当前分区,如果相同,他将不会对数据进行混洗。

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

最佳答案

添加分区:

可以使用 partitionBy 从 spark 添加分区提供于 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)

但是您可以轻松插入到 hive 表中,例如:
df.write.partitionBy('year', 'month').insertInto(String tableName)

获取所有分区:

Spark sql 基于 hive 查询语言,所以你可以使用 SHOW PARTITIONS 获取特定表中的分区列表。
sparkSession.sql("SHOW PARTITIONS partitionedHiveTable")

只要确保你有 .enableHiveSupport()当您使用 创建 session 时SparkSessionBuilder 并确定您是否有 hive-conf.xml etc.正确配置

关于apache-spark - Hive on Spark 列出特定 Hive 表的所有分区并添加一个分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40267953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com