Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 随身携带字段,还是存储并加入?_Hadoop_Apache Pig_Hadoop Streaming - Fatal编程技术网

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

Hadoop 随身携带字段,还是存储并加入?,hadoop,apache-pig,hadoop-streaming,Hadoop,Apache Pig,Hadoop Streaming,在使用Pig的Hadoop中,我在几个独立的源代码中有大量字段,我加载、筛选、项目、组,并通过几个javaudf、join、project和store运行这些字段。(这是Hadoop中的日常生活。)原始数据加载中的一些字段不被UDF使用,在最终存储之前是不需要的 什么时候通过UDF传递未使用的字段比以后存储并加入它们更好 一个简单的玩具示例是一个包含列name、weight、height的数据源,我最终想要存储name、weight、heightSquared。我的UDF将为我调整高度。哪一个更

在使用Pig的Hadoop中,我在几个独立的源代码中有大量字段,我加载、筛选、项目、组,并通过几个javaudf、join、project和store运行这些字段。(这是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';


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

如果您有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.height
,而不是将
person
及其三个字段发送到UDF。现在UDF正在接收一个包,其元组只有一个字段。顺便说一句,我不确定向UDF传递太多数据是性能问题还是可维护性问题。正如我在回答的后半部分中提到的,只有当您有几个MR周期时,性能才会起作用。至于向上投票——我只是不倾向于对问题投票,仅此而已。我无法将你在上述评论中所写的应用于我的问题。我在这里提出了一个具体问题:
inputdata = LOAD 'data' AS name,weight,height;
outputdata =
    FOREACH inputdata
    GENERATE
        name,
        weight,
        myudf.squareHeight(height) AS heightSquared;
STORE outputdata INTO 'output';