Hive外表对应hdfs路径下文件已正常写入,但查询结果为空

问题描述/异常栈

Hive外表对应hdfs路径下文件已正常写入,但查询结果为空

解决方案

1、修改表结构,统一INPUTFORMATOUTPUTFORMAT。(建议使用)  
2、写入数据时,加入参数:  
set hive.exec.compress.output=true;  
set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;

问题原因

1Hdfs 文件或路径为隐藏文件(以下划线或点开头);

2、创建Hive内部表,直接从其他hdfs移动数据到表对应Location下,此时需在hive中执行msck repair table  xxxxx;

3、创建Hive外部分区表,需保证hive表已创建分区,数据文件保存在分区目录下即可;

4Hive 元数据执行文件格式与实际文件不符,典型案例为表的读方法(INPUTFORMAT)为lzo 压缩,但写方法(OUTPUTFORMAT)为TEXT,当运行insert into xx.xx的时候,根据OUTPUTFORMAT写入了TEXT文件,但SELECT这个表的时候,读方法是LZO压缩,所以没有任何数据显示。

比如某表的建表语句如下:
CREATE EXTERNAL TABLE `test.abc`(
  `a` string COMMENT '', 
  `b` string COMMENT '', 
  `c` bigint COMMENT '', 
  `e` bigint COMMENT '', 
  `e` bigint COMMENT '', 
  `f` bigint COMMENT '')
PARTITIONED BY ( 
  `datekey` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
STORED AS INPUTFORMAT 
  'com.hadoop.mapred.DeprecatedLzoTextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

上表的写入方法为org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat,即TEXT格式,读方法为com.hadoop.mapred.DeprecatedLzoTextInputFormat,即以lzo压缩文件去读取。
如果运行SQL:
insert into test.abc select * from test.abcdef;
此时写入test.abc的数据文件是TEXT。再运行select * from test.abc时,lzo的方法无法读取TEXT文件,所以结果集为空。

作者:林帅