Apache Pig中的SUM

时间:2013-10-02 13:05:12

标签: apache-pig

如何在以下示例中显示相同分类和类型的大小的和?

((classification,Secret),(type,Document.Office),{((size,557856))}) ((classification,Secret),(type,Blog.ExternalPost),{((size,4478993))}) ((classification,Secret),(type,Social.Post.Twitter),{((size,1902045))}) ((classification,Secret),(type,Social.Post.Facebook),{((size,2085060)),((size,557856)),((size,1555956))}) ((classification,External),(type,Blog.ExternalPost),{((size,1902045))}) ((classification,External),(type,Blog.InternalPost),{((size,1438853))}) ((classification,External),(type,Social.Post.Facebook),{((size,1234311)),((size,4260972))})

这是Pig中上述关系的describe函数的输出;

{classification: (name: chararray,value: chararray),type: (name: chararray,value: chararray),{(size: (name: chararray,value: int))}}

我尝试过以下但没有运气:

sum = foreach groupedfinal generate $0, $1, SUM($2);

错误:无法将org.apache.pig.builtin.SUM的匹配函数推断为多个或不适合。请使用明确的演员

非常感谢您的帮助。

由于 Mskh

1 个答案:

答案 0 :(得分:1)

这里有几个问题。首先,错误消息:这表明Pig无法确定要计算哪种SUM - 它是否对整数,浮点数等求和。SUM的输入应该是一个包,每个元组都有在包中包含一个要加总的数字。这对你不起作用,因为包中的每个元组都包含另一个元组。

这给我们带来了第二个问题:您的数据组织。在语义上,您实际上只有三个字段:classificationtype和一包size s。但是您将这三个字段存储在元组中,并在每个元组的第一个元素中将字段的名称复制为chararray。这会浪费空间并使您的数据更难处理。

你可以突出显示一个包的元组的单个元素,比如$2.size来获得这些元素的包。但在你的情况下,这并没有改变任何东西,因为你的包中的每个size都不是数字,它是另一个元组,并且没有办法访问这个元组的元素。

你可以通过FLATTEN来解决这个问题,然后FLATTEN使用元组,然后重新GROUP,但我认为最好的解决方案是进一步查看上游并重新构建数据,这样就不会有这种嵌套和无用的字段。