写入动态分区java spark

qij5mzcb  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(487)

我在配置单元中创建了下表:

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");

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

show partitions mytable

select * from mytable where load_date="15_07_2018"

我有0张记录。
发生了什么,我该怎么解决?

编辑

如果在色调中运行以下命令:

msck repair table mytable

如果我解决了这个问题,我如何在我的代码中实现它?

1sbrub3j

1sbrub3j1#

配置单元在其元存储区中为每个表存储分区列表。但是,如果将新分区直接添加到hdfs中(比如使用hadoop fs-put命令(或.save..etc),那么metastore(以及因此而来的hive)将不会知道这些分区,除非用户运行以下命令之一
元存储检查命令(msck repair table) msck repair table <db.name>.<table_name>; (或)
altertable\u name在每个新添加的分区上添加分区命令。
我们还可以使用ALTERTABLE语句添加分区,通过这种方式,我们需要将每个新创建的分区添加到表中

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

运行上述任一语句,然后再次检查数据以获取load\u date=“15\u 07\u 2018”
有关更多详细信息,请参阅以下链接添加分区和msck修复表

相关问题