向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目录。

在以下过程中,我可以毫无问题地加载:

  1. 将数据从ORC表tab导出到HDFS文本文件
  2. 从文本文件加载到Hive临时表中
  3. 将数据从临时表加载回tab
  4. 现在我可以从tab选择/导出到其他表,而不会丢失任何记录
  5. 我怀疑问题是ORC格式。我只是不明白为什么它可以毫无问题地导出到HDFS文本文件,但是导出到另一个表(无论其他表使用哪种存储格式)都会丢失数据。

我有一个分区表选项卡,我想从中创建一些tmp表test1。这是我创建tmp表的方式:如果不存在test1,则创建表(COL1字符串,COL2字符串,COL3字符串)...

答案

在Serde属性下面使用此属性:

以上是关于向Hive表中插入覆盖保存的记录少于实际记录数的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何更快地插入数百万条记录? [关闭]

使用 hive sql 批量插入数百万条记录到 hive?

PySpark - 分区中覆盖的数据

在 HIve 中加载比实际更多的记录

更新 hive 表中的增量记录

有没有办法在插入操作时检查 Hive 表中插入了多少行?