我使用以下查询创建了分区的Hive表
CREATE EXTERNAL TABLE `customer`(
`cid` string COMMENT '',
`member` string COMMENT '',
`account` string COMMENT '')
PARTITIONED BY (update_period string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
LOCATION
'hdfs://nameservice1/user/customer'
TBLPROPERTIES (
'avro.schema.url'='/user/schema/Customer.avsc')
我正在使用map reduce程序写入分区位置。当我使用avro工具读取输出文件时,它以json格式显示正确的数据。但是,当我使用配置单元查询来显示数据时,什么也没有显示。如果我在表创建过程中不使用分区字段,那么值将显示在配置单元中。这可能是什么原因?我将mapreduce程序的输出位置指定为“ / user / customer / update_period = 201811”。
我需要在mapreduce程序配置中添加任何内容来解决此问题吗?
答案 0 :(得分:0)
在HDFS位置加载新分区后,您需要运行 msck repair table
。
为什么每次提取后每次都需要运行msck Repair表语句?
Hive在其元存储区中存储每个表的分区列表。但是,将 新分区直接添加到HDFS 中,除非用户使用以下两种方式之一添加新添加的内容,否则metastore(因此Hive)将不会意识到这些分区。分区。
1。将每个分区添加到表中
hive> alter table <db_name>.<table_name> add partition(`date`='<date_value>')
location '<hdfs_location_of the specific partition>';
(或)
2。使用修复表选项运行Metastore检查
hive> Msck repair table <db_name>.<table_name>;
会将有关分区的元数据添加到Hive元存储中,以获取尚不存在此类元数据的分区。换句话说,它将把HDFS上存在但元存储中不存在的所有分区添加到元存储中。