我在配置单元中创建了下表:
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
如果我解决了这个问题,我如何在我的代码中实现它?
1条答案
按热度按时间1sbrub3j1#
配置单元在其元存储区中为每个表存储分区列表。但是,如果将新分区直接添加到hdfs中(比如使用hadoop fs-put命令(或.save..etc),那么metastore(以及因此而来的hive)将不会知道这些分区,除非用户运行以下命令之一
元存储检查命令(msck repair table)
msck repair table <db.name>.<table_name>;
(或)altertable\u name在每个新添加的分区上添加分区命令。
我们还可以使用ALTERTABLE语句添加分区,通过这种方式,我们需要将每个新创建的分区添加到表中
运行上述任一语句,然后再次检查数据以获取load\u date=“15\u 07\u 2018”
有关更多详细信息,请参阅以下链接添加分区和msck修复表