如何在以下示例中显示相同分类和类型的大小的和?
((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
答案 0 :(得分:1)
这里有几个问题。首先,错误消息:这表明Pig无法确定要计算哪种SUM
- 它是否对整数,浮点数等求和。SUM
的输入应该是一个包,每个元组都有在包中包含一个要加总的数字。这对你不起作用,因为包中的每个元组都包含另一个元组。
这给我们带来了第二个问题:您的数据组织。在语义上,您实际上只有三个字段:classification
,type
和一包size
s。但是您将这三个字段存储在元组中,并在每个元组的第一个元素中将字段的名称复制为chararray
。这会浪费空间并使您的数据更难处理。
你可以突出显示一个包的元组的单个元素,比如$2.size
来获得这些元素的包。但在你的情况下,这并没有改变任何东西,因为你的包中的每个size
都不是数字,它是另一个元组,并且没有办法访问这个元组的元素。
你可以通过FLATTEN
来解决这个问题,然后FLATTEN
使用元组,然后重新GROUP
,但我认为最好的解决方案是进一步查看上游并重新构建数据,这样就不会有这种嵌套和无用的字段。