猪 - 比较两个相似的陈述:一个工作,另一个没有

时间:2015-05-08 12:50:20

标签: apache-pig

我开始对PIG非常恼火:语言似乎真的不稳定,文档很差,互联网上没有那么多的例子,代码中的任何小变化都会产生根本的差异:从失败到预期的结果....这是最后一个主题:

grunt> describe actions_by_unite;
actions_by_unite: {
    group: chararray,
    nb_actions_by_unite_and_action: {
        (
            unite: chararray,
            lib_type_action: chararray,
            double
        )
    }
}

-- works :
z = foreach actions_by_unite {      
generate group, SUM(nb_actions_by_unite_and_action.$2);};


-- doesn't work :
z = foreach actions_by_unite {      
x = SUM(nb_actions_by_unite_and_action.$2);
generate group, x;};

-- error : 
2015-05-08 14:43:44,712 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: Pig script failed to parse: 
<line 107, column 16> Invalid scalar projection: x : A column needs to be projected from a relation for it to be used as a scalar
Details at logfile: /private/tmp/pig-err.log

所以:

-- doesn't work neither:
z = foreach actions_by_unite {      x = SUM(nb_actions_by_unite_and_action.$2);
                                    generate group, x.$0;};
--error :
org.apache.pig.backend.executionengine.ExecException: ERROR 0: Scalar has more than one row in the output. 1st : (AC,EMAIL,1.1186133550060547E-4), 2nd :(AC,VISITE,6.25755280560356E-4)
    at org.apache.pig.impl.builtin.ReadScalars.exec(ReadScalars.java:120)

有谁会知道为什么? 您是否有一些不错的博客/资源可以通过示例来掌握这种语言? 我有一本书,但似乎有点旧,我有敏捷数据科学&#39;以及&#34; Hadoop权威指南&#34;预订了一些例子...我发现这个页面非常有趣:https://shrikantbang.wordpress.com/2014/01/14/apache-pig-group-by-nested-foreach-join-example/

关于课程或其他输入的任何好视频?你们这个语言也有问题吗?或者我只是愚蠢?....

1 个答案:

答案 0 :(得分:0)

尤其不是因为Pig不稳定,这是因为你想要做的事情在第一种方法中是正确的,但在其他方面是错误的。

制作group by时,每个组都有一个包含X元组的包。在嵌套的foreach中,每个迭代都有一个包含其包的组,这意味着其中的SUM将产生一个标量值:您当前使用的包的总和。 Apache Pig不适用于标量,它适用于关系,因此您无法为别名指定标量值,这正是您在第二种和第三种方法中所做的。

因此,错误来自于尝试类似:

A = foreach B {
    x = SUM(bag.$0);
}

但是,如果你想为每个组发射标量,只要你从未将标量指定给别名,就可以完美地执行此操作。这就是为什么如果你在foreach的末尾做总和,它会完美地工作,因为你为每个组返回一个具有两个值的元组:组和总和。