FAQ - Hive外表对应hdfs路径下文件已正常写入,但查询结果为空
更新时间: 2024-11-14 15:25:37
阅读 6715
Hive外表对应hdfs路径下文件已正常写入,但查询结果为空
问题描述/异常栈
Hive外表对应hdfs路径下文件已正常写入,但查询结果为空
解决方案
1、修改表结构,统一INPUTFORMAT和OUTPUTFORMAT。(建议使用)
2、写入数据时,加入参数:
set hive.exec.compress.output=true;
set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;
问题原因
1、Hdfs 文件或路径为隐藏文件(以下划线或点开头);
2、创建Hive内部表,直接从其他hdfs移动数据到表对应Location下,此时需在hive中执行msck repair table xxxxx;
3、创建Hive外部分区表,需保证hive表已创建分区,数据文件保存在分区目录下即可;
4、Hive 元数据执行文件格式与实际文件不符,典型案例为表的读方法(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文件,所以结果集为空。
如果是通过传输任务写入hive表也可以考虑增加参数来规避这个问题
ndi.spark.spark-conf.spark.hive.exec.compress.output =true;
ndi.spark.spark-conf.spark.hadoop.mapred.output.compression.codec=
com.hadoop.compression.Izo.LzopCodec;
即可
作者:林帅
文档反馈
以上内容对您是否有帮助?