【问题标题】:Insert overwrite to Hive table saves less records than actual record number插入覆盖到 Hive 表保存的记录少于实际记录数
【发布时间】:2019-09-25 00:13:21
【问题描述】:

我有一个分区表 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文本文件,但是导出到另一个表(无论另一个表使用什么存储格式)都会丢失数据。

【问题讨论】:

  • 这可能是统计问题:stackoverflow.com/a/39914232/2700344
  • @leftjoin 我一开始也是这么想的,但是在我将hive.compute.query.using.stats 设置为false 之后,计数还是一样的。我尝试计算tmp表“test1”的其他指标,列值的总和也反映了记录的缺失。
  • 可能是记录被追加到表test1中

标签: hadoop hive hiveql


【解决方案1】:

使用下面的 serde 属性:

) 行格式 SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 与SERDEPROPERTIES( "separatorChar" = ",", "quoteChar" = "\"" ) 存储为文本文件

【讨论】:

  • 1.格式化您的问题,以便更清楚哪些部分是代码。 2.添加代码说明。
猜你喜欢
  • 1970-01-01
  • 2014-03-27
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2020-01-12
  • 1970-01-01
相关资源
最近更新 更多