gpt4 book ai didi

java - 写入动态分区Java-Spark

转载 作者:行者123 更新时间:2023-11-30 06:05:57 26 4
gpt4 key购买 nike

我在 Hive 中创建了下表:

CREATE TABLE mytable (..columns...) PARTITIONED BY (load_date string) STORED AS ...

我正在尝试使用 Spark 将数据插入到我的表中,如下所示:

Dataset<Row> dfSelect = df.withColumn("load_date","15_07_2018");
dfSelect.write().mode("append").partitionBy("load_date").save(path);

并进行以下配置:

sqlContext().setConf("hive.exec.dynamic.partition","true");
sqlContext().setConf("hive.exec.dynamic.partition.mode","nonstrict");

在我发出写入命令后,我在 HDFS 上看到目录 /myDbPath/load_date=15_07_2018,其中包含我编写的文件,但当我进行如下查询时:

show partitions mytable

select * from mytable where load_date="15_07_2018"

我得到 0 条记录。

发生了什么以及如何解决这个问题?

编辑

如果我在 Hue 中运行以下命令:

msck repair table mytable

我解决了这个问题,我该如何在我的代码中做到这一点?

最佳答案

Hive 在其元存储中存储每个表的分区列表。但是,如果新分区直接添加到 HDFS(例如使用 hadoop fs -put 命令(或).save 等),元存储(以及 Hive)将不会意识到这些分区,除非用户运行以下任一命令

  1. 元存储检查命令(msck 修复表)

msck repair table <db.name>.<table_name>;

(或)

  • 对每个新添加的分区执行 ALTER TABLE table_name ADD PARTITION 命令。
  • 我们还可以通过使用alter table语句添加分区,通过这种方式我们需要将每个新创建的分区添加到表中

    alter table <db.name>.<table_name> add partition(load_date="15_07_2018") location <hdfs-location>;

    运行上述任一语句,然后再次检查数据是否为 ​​load_date="15_07_2018"

    有关更多详细信息,请参阅这些链接 add partitionsmsck repair table

    关于java - 写入动态分区Java-Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51347062/

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