我正在Hive外部表上执行INSERT语句。我注意到,对于每个新的INSERT,在外部表引用的HDFS路径中创建了一个新文件。我的问题是:
是否可以将新插入的数据作为附加而不是创建新文件?
我可以控制它达到一定的大小,比如1MB,只有Hive会创建一个新文件来放置传入的插入吗?
答案 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将包含一个包含组合数据的文本文件。
我知道这不太理想,而且更像是一种解决方法。