我在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
我解决了这个问题,如何在我的代码中完成呢?
答案 0 :(得分:1)
Hive在其元存储区中存储每个表的分区列表。但是,如果将新分区直接直接添加到HDFS (例如,通过使用hadoop fs -put命令(或).save..etc),则元存储(因此,Hive)将不会意识到这些分区,除非用户运行以下命令之一
msck repair table <db.name>.<table_name>;
(或)
我们还可以通过使用alter table语句添加分区,这种方式需要将每个新创建的分区添加到表中
alter table <db.name>.<table_name> add partition(load_date="15_07_2018") location <hdfs-location>;
运行以上任一语句,然后再次检查数据是否为load_date =“ 15_07_2018”
有关更多详细信息,请参考以下链接add partitions和msck repair table