首页 > 解决方案 > 插入覆盖到 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到其他表而不会丢失任何记录

我怀疑问题出在 ORC 格式中。我只是不明白为什么它可以毫无问题地导出到HDFS文本文件,但是导出到另一个表(无论另一个表使用什么存储格式)都会丢失数据。

标签: hadoophivehiveql

解决方案


使用下面的 serde 属性:

) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 与 SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "\"" ) 存储为 TEXTFILE


推荐阅读