插入覆盖到Hive表中保存的记录少于实际记录数

时间:2019-05-07 10:41:33

标签: hadoop hive hiveql

我有一个分区表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');

由于两个表共享相同的格式,因此加载过程基本上只是将数据文件从HDFS源目录移动到Hive目录。

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

  1. 将数据从ORC表tab导出到HDFS文本文件
  2. 从文本文件加载到Hive临时表
  3. 从临时表中将数据加载回tab
  4. 现在我可以从tab选择/导出到其他表,而不会丢失任何记录

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

1 个答案:

答案 0 :(得分:-1)

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

)  行格式SERDE'org.apache.hadoop.hive.serde2.OpenCSVSerde'  与SERDEPROPERTIES(  “ separatorChar” =“,”,  “ quoteChar” =“ \”“  )  存储为TEXTFILE