如何强制CTAS生成单个文件?

时间:2017-02-20 06:04:25

标签: hadoop hive hdfs

我正在使用HDP 2.5和hive服务。当我使用下面的查询创建hive表;

create table Sample_table 
row format delimited 
fields terminated by '|' 
stored as textfile 
AS 
select * 
from sample_table_unique 
where state='AL'; 

我可以创建具有特定位置的外部表。

我的问题是当我创建表/外部表时,存储的文件已被拆分,即。喜欢下面明智的文件已被拆分。

/应用/蜂巢/仓库/ SAMPLEDB / sample_table: 00000_0, 00001_0, 00002_0, 00003_0,

我不想要那些拆分文件,我想要一个像00000_0这样的合并文件。我不知道它是怎么发生的。请告诉我如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

SELECT语句运行mapper / mapreduce(取决于select查询)作业,将数据从源表sample_table写入目标表sample_table_unique。 根据任务数量,生成的文件数可能会有所不同。 要将它们合并为一个,您可以在hive-site.xml

中为永久会话设置这些属性
hive> SET hive.merge.mapfiles=true;
hive> SET hive.merge.mapredfiles=true;
hive> SET hive.merge.smallfiles.avgsize=16000000;
hive> SET hive.merge.size.per.task=256000000;

如果是TEZ执行引擎,请使用

hive> SET hive.merge.tezfiles=true;

而不是mapfilesmapredfiles

当作业的平均输出文件大小小于此hive.merge.smallfiles.avgsize数时,Hive将启动另一个map-reduce作业,以将输出文件合并为更大的文件。 hive.merge.smallfiles.avgsizehive.merge.size.per.task的值是默认值,请根据输入大小进行相应更改。