【问题标题】:Carry fields around, or store and join?随身携带田地,还是存储和加入?
【发布时间】:2014-02-05 21:47:20
【问题描述】:

在使用 Pig 的 Hadoop 中,我在几个单独的源中有大量字段,我加载、过滤、项目、组、通过几个 Java UDF 运行、加入、项目和存储。 (这就是 Hadoop 中的日常生活。)UDF 不使用原始数据加载中的某些字段,并且在最终存储之前不需要。

什么时候通过 UDF 传递未使用的字段比稍后存储和加入它们更好?

一个简单的玩具示例是包含name,weight,height 列的数据源,我最终想存储name,weight,heightSquared。我的 UDF 将为我调整高度。哪个更好:

inputdata = LOAD 'data' AS name,weight,height;
outputdata = FOREACH inputdata
                GENERATE myudf.squareHeight(name,weight,height)
                AS (name,weight,heightSquared);
STORE outputdata INTO 'output';

inputdata = LOAD 'data' AS name,weight,height;
name_weight = FOREACH inputdata
                GENERATE name,weight;
intdata1 = FOREACH inputdata
                GENERATE myudf.squareHeight(name,height)
                AS (iname,heightSquared);
intdata2 = JOIN intdata1 BY iname, name_weight BY name;
outputdata = FOREACH intdata2
                GENERATE name,weight,heightSquared;
STORE outputdata INTO 'output';

在这种情况下,它看起来很明显:第一种情况更好。但是UDF 确实必须读取、存储和输出weight 字段。当您有 15 个字段时,UDF 不关心并且有一个字段,第一种情况是否更好?

【问题讨论】:

    标签: hadoop apache-pig hadoop-streaming


    【解决方案1】:

    如果您有 15 个 UDF 不关心的字段,则不要将它们发送到 UDF。在您的示例中,如果仅使用第三个字段,则没有理由编写 UDF 来获取三个字段。您的示例的最佳脚本是

    inputdata = LOAD 'data' AS name,weight,height;
    outputdata =
        FOREACH inputdata
        GENERATE
            name,
            weight,
            myudf.squareHeight(height) AS heightSquared;
    STORE outputdata INTO 'output';
    

    这样就解决了 UDF 的情况。如果您有一堆要存储的字段,但您不会在接下来的几个 map-reduce 循环中使用它们,您可能希望立即存储它们,然后将它们重新加入。但是需要根据经验测试哪种方法更适合您的具体情况。

    【讨论】:

    • 这是我提出的问题的一个很好的答案。 (我不确定如何将它应用于我的 实际 情况,我将元组的数据包传递给 UDF 并获得一个元组的数据包作为回报。我将作为一个单独的问题提出。 )
    • 顺便说一句,您花时间写了一个不错的答案,但没有对这个问题投赞成票。是什么让它没有获得支持?
    • 元组包也不例外。您可以使用投影算子将您的行李减少到感兴趣的领域。无需将person 发送到具有三个字段的UDF,只需发送person.height。现在 UDF 正在接收一个包,它的元组只有一个字段。顺便说一句,我不确定将太多数据传递给 UDF 是性能问题还是可维护性问题。正如我在答案的后半部分提到的那样,只有当您有多个 MR 周期时,性能才会发挥作用。至于赞成票——我只是不倾向于对问题投票,仅此而已。
    • 我无法将您在上述评论中写的内容应用于我的问题。我在这里问了具体问题:stackoverflow.com/questions/21711584/…
    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-17
    • 2017-11-05
    相关资源
    最近更新 更多