hadoop - 插入覆盖到 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 目录。
在以下过程中,我可以毫无问题地加载:
- 将数据从 ORC 表导出
tab
到 HDFS 文本文件 - 从文本文件加载到 Hive 临时表
tab
从临时表加载数据- 现在我可以选择/导出
tab
到其他表而不会丢失任何记录
我怀疑问题出在 ORC 格式中。我只是不明白为什么它可以毫无问题地导出到HDFS文本文件,但是导出到另一个表(无论另一个表使用什么存储格式)都会丢失数据。
解决方案
使用下面的 serde 属性:
) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 与 SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "\"" ) 存储为 TEXTFILE
推荐阅读
- c# - 抽象 .NET Core 3 应用程序启动问题
- javascript - 如果后端服务器已关闭,那么如何使用 Axios 在 Reactjs 中进行处理
- list - Prolog - 从列表中删除具有相同第一个值的对
- powershell - PowerShell:是否必须将脚本模块保存在与目录相同的名称中
- pandas - DataFrame 对象没有属性插入
- sql-server - 使用 asp.net mvc 时如何将表单的详细信息提交到数据库?
- ruby - 安装 redmine 插件时出错
- localization - 如何编写全局函数以在 Angular 6 中的所有组件中使用
- php - PHP date_default_timezone_set() 未返回预期结果
- javascript - Object.keys 返回空数组