我的输入包含大量小型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个文件,但是所有这些文件都被合并到一个不需要的文件中输出
有人可以让我知道,出了什么问题,
答案 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