使用 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 加入两个排序的文件的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop详解——Hive的原理和安装配置和UDF,flume的安装和配置以及简单使用,flume+hive+Hadoop进行日志处理