配置单元查询不读取分区字段

时间:2018-12-03 03:07:10

标签: hadoop hive mapreduce avro hadoop-partitioning

我使用以下查询创建了分区的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程序配置中添加任何内容来解决此问题吗?

1 个答案:

答案 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上存在但元存储中不存在的所有分区添加到元存储中。