【发布时间】:2015-07-09 01:07:38
【问题描述】:
我正在 Hive 外部表上执行 INSERT 语句。我注意到,对于每个新的 INSERT,都会在外部表引用的 HDFS 路径中创建一个新文件。我的问题是:
是否可以将新插入的数据作为追加而不是创建新文件?
我可以控制它以达到一定的大小,比如 1MB,然后 Hive 才会创建一个新文件来放置传入的插入?
【问题讨论】:
我正在 Hive 外部表上执行 INSERT 语句。我注意到,对于每个新的 INSERT,都会在外部表引用的 HDFS 路径中创建一个新文件。我的问题是:
是否可以将新插入的数据作为追加而不是创建新文件?
我可以控制它以达到一定的大小,比如 1MB,然后 Hive 才会创建一个新文件来放置传入的插入?
【问题讨论】:
Cloudera 说:
INSERT INTO 语法将数据附加到表中。现有数据文件保持原样,将插入的数据放入一个或多个新数据文件中。
Hive 将追加表而不是基础文件。
您可以强制 hive 使用另一个 create table 来构建表,并强制 reducer 到一个。这会将碎片文件复制到一个表中,并将它们组合到 HDFS 中的另一个位置。然后你可以交换 HDFS 中的文件。
您可以将文件放置在一个暂存区,然后检查 hdfs 中文件的大小,然后将它们移到上面。然而,将文件暂时保存在本地文件系统上并将它们移动似乎更容易。
要使用 hive 将文件合并到一个新文件中,您可以尝试:
set hive.exec.dynamic.partition.mode=nostrict;
set hive.exec.compress.intermediate=false;
set hive.exec.compress.output=false;
set hive.exec.reducers.max=1;
create table if not exists db.table
stored as textfiel as
select * from db.othertable;
db.othertable 是具有多个碎片文件的表。 db.table 将有一个包含组合数据的文本文件。
我知道这并不理想,更像是一种变通方法。
【讨论】: