合并小的ORC文件的Hive操作

3

我的输入由大量小的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个文件,但所有这些文件都被合并成了一个单独的文件,这不是我想要的输出结果。

能否有人告诉我出了什么问题?


mapred 属性已经全部被弃用。 - OneCricketeer
1
@cricket_007 哦,好的,谢谢,我刚刚找到了答案,我们可以使用聚类将分区进一步分成多个部分。我正在探索Hive,因为我的Spark输出有太多小文件,如果我通过Presto向最终用户公开这些较小的文件,那么在这些较小的文件上查询将会变慢。https://community.hortonworks.com/content/supportkb/49637/hive-bucketing-and-partitioning.html - Rajiv
你应该在Spark中使用coalescerepartition来解决你的小文件问题。 - OneCricketeer
是的,我已经尝试过使用coalesce,但考虑到输入数据的数量,它需要太多时间。因此,我正在避免在Spark层面使用coalesce,并且一旦事件被分区,将有选择地在Hive或Spark中为特定的一组事件应用coalesce。目前,我正在尝试在Hive中实现相同的操作。 - Rajiv
你不能在Spark层面提取分区吗?我认为没有必要写入磁盘,除了需要一些数据持久化来读取它。 - OneCricketeer
1个回答

1
您正在使用两个不同的概念来控制输出文件:
  • 分区:它设置目录
  • 分布方式:设置每个目录中的文件
如果您只想在每个目录中有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);

但我建议按照您的数据中的某一列进行分发,以便您可以进行查询。这可以提高查询时间。

您可以在此处阅读更多相关信息。


嗨@lev,我尝试了这个,但是得到了30个分区,你有什么办法可以控制它吗?我尝试将reducers设置为10,以为会得到10个文件,但最终还是得到了30个。 - Rajiv
你是对的,RAND返回0到1之间的双精度浮点数。我已经修正了答案。 - lev
我也尝试了这个,但它没有起作用,请在此处找到屏幕截图,不确定我在这里犯了什么错误 https://ibb.co/eFqorR - Rajiv
我也尝试了 Cast((FLOOR(RAND()*4.0)) as INT) % 4,但没有成功。 - Rajiv
我尝试了另一个名为“os”的字段,它有15个不同的值,理想情况下应该创建15个文件,但实际上也会生成30个文件,截图:https://ibb.co/nicOQm - Rajiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接