向Hive表中插入覆盖保存的记录少于实际记录数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向Hive表中插入覆盖保存的记录少于实际记录数相关的知识,希望对你有一定的参考价值。
我有一个分区表tab
,我想从中创建一些tmp表test1
。这是我创建tmp表的方式:
CREATE TABLE IF NOT EXISTS test1
(
COL1 string,
COL2 string,
COL3 string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;
使用以下命令写入此表:
INSERT OVERWRITE TABLE test1
SELECT TAB.COL1 as COL1,
TAB.COL2 as COL2,
TAB.COL3 as COL3
FROM TAB
WHERE PT='2019-05-01';
然后我对test1中的记录进行计数,它有94493486条记录,而以下SQL返回计数149248486:
SELECT COUNT(*) FROM
(SELECT TAB.COL1 as COL1,
TAB.COL2 as COL2,
TAB.COL3 as COL3
FROM TAB
WHERE PT='2019-05-01') AS TMP;
此外,当我将所选分区(PT是分区列)保存到HDFS时,记录数是正确的:
INSERT OVERWRITE directory '/user/me/wtfhive' row format delimited fields terminated by '|'
SELECT TAB.COL1 as COL1,
TAB.COL2 as COL2,
TAB.COL3 as COL3
FROM TAB
WHERE PT='2019-05-01';
我的Hive版本是3.1.0,随附于Ambari 2.7.1.0。任何人都不知道可能导致此问题的原因吗?谢谢。
===================更新=================>
我发现可能与此问题有关。表tab
使用ORC作为存储格式。其数据是使用另一个脚本从另一个Hive群集中另一个表的ORC数据文件中导入的:
LOAD DATA INPATH '/data/hive_dw/db/tablename/pt=2019-04-16' INTO TABLE tab PARTITION(pt='2019-04-16');
由于2个表共享相同的格式,因此加载过程基本上只是将数据文件从HDFS源目录移动到Hive目录。
在以下过程中,我可以毫无问题地加载:
- 将数据从ORC表
tab
导出到HDFS文本文件 - 从文本文件加载到Hive临时表中
- 将数据从临时表加载回
tab
- 现在我可以从
tab
选择/导出到其他表,而不会丢失任何记录
我怀疑问题是ORC格式。我只是不明白为什么它可以毫无问题地导出到HDFS文本文件,但是导出到另一个表(无论其他表使用哪种存储格式)都会丢失数据。
我有一个分区表选项卡,我想从中创建一些tmp表test1。这是我创建tmp表的方式:如果不存在test1,则创建表(COL1字符串,COL2字符串,COL3字符串)...
答案
在Serde属性下面使用此属性:
以上是关于向Hive表中插入覆盖保存的记录少于实际记录数的主要内容,如果未能解决你的问题,请参考以下文章