0

请在以下示例中显示相同分类和类型的尺寸总和?

((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 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表

您的帮助将不胜感激。

谢谢女士

4

1 回答 1

1

你在这里有几个问题。首先,错误消息:这表明 Pig 无法确定SUM要计算的类型——无论是对整数、浮点数等求和。输入SUM应该是一个袋子,其中袋子中的每个元组都包含一个要求和的数字。这对您不起作用,因为包中的每个元组都包含另一个元组。

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

您可以将包的元组中的单个元素投影出来,例如$2.size只包含这些元素的包。但是在您的情况下,这不会改变任何东西,因为size您包中的每个都不是数字,而是另一个元组,并且无法访问该元组的元素。

You could get around this by FLATTENing the bag, and then FLATTENing the tuple, and then re-GROUPing, but I think the best solution is for you to look further upstream and restructure your data so you don't have this kind of nesting and useless fields.

于 2013-10-02T15:03:05.727 回答