通过附加

时间:2015-07-08 05:35:24

标签: hive hdfs

我正在Hive外部表上执行INSERT语句。我注意到,对于每个新的INSERT,在外部表引用的HDFS路径中创建了一个新文件。我的问题是:

  1. 是否可以将新插入的数据作为附加而不是创建新文件?

  2. 我可以控制它达到一定的大小,比如1MB,只有Hive会创建一个新文件来放置传入的插入吗?

1 个答案:

答案 0 :(得分:1)

Cloudera说:

  

INSERT INTO语法将数据附加到表中。现有数据文件保持原样,插入的数据放入一个或多个新数据文件中。

Hive会附加表而不是底层文件。

您可以使用另一个create table强制hive构建表,并将reducers强制为一个。这会将碎片文件复制到一个表中,并将它们组合到HDFS中的另一个位置。然后你可以在HDFS中交换文件。

您可以将文件放在保留区域中,然后检查hdfs中文件的大小,并将其移动到上面。但是,将文件临时保存在本地文件系统上并移动它们似乎更容易。

要使用配置单元将文件合并到新文件中,您可以尝试:

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是具有多个fragemented文件的表。 db.table将包含一个包含组合数据的文本文件。

我知道这不太理想,而且更像是一种解决方法。