【问题标题】:Join two sorted files using Hive/Hadoop使用 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

谢谢

【问题讨论】:

    标签: performance sorting hadoop hive etl


    【解决方案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”的模式进行了计算。所以,这个第二个工作没有减速器。我认为这是一种可以线性扩展的解决方案。因此,如果我将集群规模扩大一倍,我的工作将在一半的时间内完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2015-05-24
      • 2015-12-27
      • 2015-05-27
      • 1970-01-01
      相关资源
      最近更新 更多