写入动态分区Java-Spark

时间:2018-07-15 09:26:38

标签: java apache-spark hive

我在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

我解决了这个问题,如何在我的代码中完成呢?

1 个答案:

答案 0 :(得分:1)

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

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

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

(或)

  1. 每个新添加的分区上的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