使用 Hive/Hadoop 加入两个排序的文件

Posted

技术标签:

【中文标题】使用 Hive/Hadoop 加入两个排序的文件【英文标题】:Join two sorted files using Hive/Hadoop 【发布时间】:2014-07-25 21:11:14 【问题描述】:

我有两个排序的文件,我需要使用 hive 或 hadoop 加入并通过键聚合。 文件 A 按 (A.X, A.Y) 排序,文件 B 按 (B.X, B.Y) 排序。我可以使用 hive 进行连接,创建一个中间结果,然后执行另一个查询来对值求和。进行此操作的最佳方法是什么?做 mapreduce 工作还是使用 hive?文件 B 比文件 A 小得多。我可以使用文件 A 和文件 B 已排序的事实吗?

FILE A       FILE B    INTERMEDIATE_FILE   FINAL_FILE
X Y  Z       X Y       X Y  Z              X Y   
1 V1 10      1 V1      1 V1 10             1 30 (20 + 10)
1 V1 20      2 V2      1 V1 20             2 50 (50)
1 V2 30      3 V1      2 V2 50             3 130 (60 + 70)
2 V1 40                3 V1 60
2 V2 50                3 V1 70
3 V1 60                
3 V1 70
4 V1 80

谢谢

【问题讨论】:

【参考方案1】:

您可以使用 pig 中的“合并”选项加入数据。

例子:

data_a = load '$input1' as (X, Y, Z);
data_b = load '$input2' as (P, Q);
join_data = join data_a by (X,Y), data_b by (P,Q) using 'merge';

对 join_data 关系执行聚合逻辑。

这是一个排序合并连接操作。通过打开两个文件并遍历它们,可以在映射阶段完成连接。 Pig 将此称为合并连接,因为它是排序合并连接,但排序已经完成。

来源:艾伦·盖茨的 Programming Pig。

【讨论】:

我认为它不会扩大规模。连接将只使用一个映射器执行,通过网络获取记录。【参考方案2】:

我创建了一个 Identy Mapper Reducer 作业,然后使用 CompositeInputFormat 执行另一个作业。在映射阶段,我使用一种名为“In-mapper Combiner”的模式进行了计算。所以,这个第二个工作没有减速器。我认为这是一种可以线性扩展的解决方案。因此,如果我将集群规模扩大一倍,我的工作将在一半的时间内完成。

【讨论】:

以上是关于使用 Hive/Hadoop 加入两个排序的文件的主要内容,如果未能解决你的问题,请参考以下文章

解析并加载到 Hive/Hadoop

Hive - Hadoop与SQL

排序算法

算法学习归并排序

加入两棵红黑树的最佳方式

Hadoop详解——Hive的原理和安装配置和UDF,flume的安装和配置以及简单使用,flume+hive+Hadoop进行日志处理