Apache pig 清管器-比较两种类似的声明:一种工作,另一种不工作

Apache pig 清管器-比较两种类似的声明:一种工作,另一种不工作,apache-pig,Apache Pig,我开始对PIG非常恼火:语言似乎真的不稳定,文档很差,互联网上的例子不多,代码中的任何微小变化都可能带来根本性的差异:从失败到预期结果。。。。这是最后一个主题的另一种形式: grunt> describe actions_by_unite; actions_by_unite: { group: chararray, nb_actions_by_unite_and_action: { ( unite: chararray,

我开始对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
有人知道为什么吗? 您是否有一些好的博客/资源可以提供,并举例说明如何掌握这门语言? 我有o'reilly的书,但它似乎有点老了,我有《敏捷数据科学》和《Hadoop权威指南》,其中有一些例子。。。我发现这个页面非常有趣:


有关于coursera或其他输入的好视频吗?你们这些家伙也有这种语言的问题吗?或者我只是个傻瓜?…

这并不是因为猪不稳定,而是因为你试图做的第一种方法是正确的,而其他方法是错误的

当您按分组时,每个分组都有一个包含X个元组的包。在嵌套的foreach中,每个迭代都有一个组及其包,这意味着其中的
SUM
将产生一个标量值:您当前使用的包的总和。ApachePig不使用标量,它使用关系,因此您不能将标量值分配给别名,这正是您在第二种和第三种方法中所做的

因此,错误来自尝试以下操作:

A = foreach B {
    x = SUM(bag.$0);
}
但是,如果要为每个组发出标量,只要从不将标量指定给别名,就可以完美地执行此操作。这就是为什么如果您在
foreach
的末尾进行求和,它会非常有效,因为您将为每个组返回一个包含两个值的元组:group和sum

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