【发布时间】: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 目录。
在以下过程中,我可以毫无问题地加载:
- 将数据从 ORC 表
tab导出到 HDFS 文本文件 - 从文本文件加载到 Hive 临时表
- 从临时表将数据加载回
tab - 现在我可以从
tab选择/导出到其他表而不会丢失任何记录
我怀疑问题出在 ORC 格式中。我只是不明白为什么它可以毫无问题地导出到HDFS文本文件,但是导出到另一个表(无论另一个表使用什么存储格式)都会丢失数据。
【问题讨论】:
-
这可能是统计问题:stackoverflow.com/a/39914232/2700344
-
@leftjoin 我一开始也是这么想的,但是在我将
hive.compute.query.using.stats设置为false 之后,计数还是一样的。我尝试计算tmp表“test1”的其他指标,列值的总和也反映了记录的缺失。 -
可能是记录被追加到表test1中