携带字段,还是存储并加入?

ftf50wuq  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(291)

在使用pig的hadoop中,我在几个独立的源代码中有大量的字段,这些字段是我加载、筛选、项目、组、运行几个javaudf、连接、项目和存储的(这是hadoop中的日常生活。)原始数据加载中的一些字段不被udf使用,在最终存储之前是不需要的。
什么时候通过自定义项传递未使用的字段比以后存储并加入它们更好?
一个简单的玩具示例是带有列的数据源 name,weight,height 我最终想储存 name,weight,heightSquared . 我的自定义项将为我的身高平方米。哪个更好:

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个领域的自定义项不关心,它有一个,第一种情况是更好的?

bt1cpqcv

bt1cpqcv1#

如果有15个字段是自定义项不关心的,那么不要将它们发送给自定义项。在您的示例中,如果只使用第三个字段,那么就没有理由编写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循环中都不会使用它们,那么您可能希望立即存储它们,然后将它们重新加入。但这将是一个经验测试的问题,哪种方法对你的具体情况更快。

相关问题