猪 - 比较两个相似的陈述:一个有效,另一个无效
Pig - comparing two similar statement : one working, the other not
我开始对 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.);};
-- doesn't work :
z = foreach actions_by_unite {
x = SUM(nb_actions_by_unite_and_action.);
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.);
generate group, x.[=11=];};
--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)
有谁知道为什么?
您是否有一些不错的博客/资源可以提供一些例子来掌握这门语言?
我有 o'reilly 的书,但它看起来有点旧,我有 'Agile Data Science' 和 "Hadoop definitive guide" 的书,里面有一些例子......我发现这个页面真的很有趣:https://shrikantbang.wordpress.com/2014/01/14/apache-pig-group-by-nested-foreach-join-example/
关于 coursera 或其他输入的任何好的视频?你们也有这种语言的问题吗?或者我只是愚蠢?....
特别是这件事不是因为 Pig 不稳定,而是因为您尝试做的事情在第一种方法中是正确的,但在其他方法中是错误的。
当你创建一个 group by
时,每个组都有一个包含 X 个元组的包。在嵌套的 foreach 中,每次迭代都有一组及其包,这意味着其中的 SUM
将产生一个标量值:您当前正在使用的包的总和。 Apache Pig 不使用标量,它使用关系,因此您不能将标量值分配给别名,这正是您在第二种和第三种方法中所做的。
因此,错误来自尝试类似的操作:
A = foreach B {
x = SUM(bag.[=10=]);
}
但是,如果您想为每个组发射一个标量,您完全可以做到这一点只要您从不将标量分配给别名。这就是为什么如果您在 foreach
的末尾进行求和,它会完美地工作,因为您将为每个组返回一个具有两个值的元组:组和总和。
我开始对 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.);};
-- doesn't work :
z = foreach actions_by_unite {
x = SUM(nb_actions_by_unite_and_action.);
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.);
generate group, x.[=11=];};
--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)
有谁知道为什么? 您是否有一些不错的博客/资源可以提供一些例子来掌握这门语言? 我有 o'reilly 的书,但它看起来有点旧,我有 'Agile Data Science' 和 "Hadoop definitive guide" 的书,里面有一些例子......我发现这个页面真的很有趣:https://shrikantbang.wordpress.com/2014/01/14/apache-pig-group-by-nested-foreach-join-example/
关于 coursera 或其他输入的任何好的视频?你们也有这种语言的问题吗?或者我只是愚蠢?....
特别是这件事不是因为 Pig 不稳定,而是因为您尝试做的事情在第一种方法中是正确的,但在其他方法中是错误的。
当你创建一个 group by
时,每个组都有一个包含 X 个元组的包。在嵌套的 foreach 中,每次迭代都有一组及其包,这意味着其中的 SUM
将产生一个标量值:您当前正在使用的包的总和。 Apache Pig 不使用标量,它使用关系,因此您不能将标量值分配给别名,这正是您在第二种和第三种方法中所做的。
因此,错误来自尝试类似的操作:
A = foreach B {
x = SUM(bag.[=10=]);
}
但是,如果您想为每个组发射一个标量,您完全可以做到这一点只要您从不将标量分配给别名。这就是为什么如果您在 foreach
的末尾进行求和,它会完美地工作,因为您将为每个组返回一个具有两个值的元组:组和总和。