Hive合并小ORC文件

时间:2017-10-28 20:38:57

标签: hadoop apache-spark hive mapreduce amazon-emr

我的输入包含大量小型ORC文件,我想在每天结束时将其合并,并且我希望将数据拆分为100MB块。

我的输入和输出都是S3和环境使用是EMR,

正在设置的Hive参数,

set hive.msck.path.validation=ignore;
set hive.exec.reducers.bytes.per.reducer=256000000;
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.mapred.mode = nonstrict;

set hive.merge.mapredfiles=true;
set hive.merge.mapfile=true ;

set hive.exec.parallel = true;
set hive.exec.parallel.thread.number = 8;

SET hive.exec.stagingdir=/tmp/hive/  ;
SET hive.exec.scratchdir=/tmp/hive/ ;

set mapred.max.split.size=68157440;
set mapred.min.split.size=68157440;
set hive.merge.smallfiles.avgsize=104857600;
set hive.merge.size.per.task=104857600;
set mapred.reduce.tasks=10;

我的插入声明:

insert into table dev.orc_convert_zzz_18 partition(event_type) select * from dev.events_part_input_18 where event_type = 'ScreenLoad' distribute by event_type;

现在的问题是,我有大约80个输入文件,总共500MB大小,在这个插入语句之后,我期待S3中的4个文件,但是所有这些文件都被合并到一个不需要的文件中输出

有人可以让我知道,出了什么问题,

1 个答案:

答案 0 :(得分:1)

您正在使用2个不同的概念来控制输出文件:

  • 分区:设置目录
  • 分发方式:设置每个目录中的文件

如果您只想在每个目录中包含4个文件,则只能通过随机数分发,例如:

insert into table dev.orc_convert_zzz_18 partition(event_type) 
select * from dev.events_part_input_18 
where event_type = 'ScreenLoad' distribute by Cast((FLOOR(RAND()*4.0)) as INT);

但我建议您在数据中按某些列分发您可能会查询的内容。它可以缩短您的查询时间。

可以详细了解here