我有一个分区表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目录。
在以下过程中,我可以毫无问题地加载:
tab
导出到HDFS文本文件tab
tab
选择/导出到其他表,而不会丢失任何记录我怀疑问题是ORC格式。我只是不明白为什么它可以毫无问题地导出到HDFS文本文件,但是导出到另一个表(无论其他表使用哪种存储格式)都会丢失数据。
答案 0 :(得分:-1)
在serde属性下面使用此属性:
) 行格式SERDE'org.apache.hadoop.hive.serde2.OpenCSVSerde' 与SERDEPROPERTIES( “ separatorChar” =“,”, “ quoteChar” =“ \”“ ) 存储为TEXTFILE