Apache Pig 中的 SUM
Posted
技术标签:
【中文标题】Apache Pig 中的 SUM【英文标题】:SUM in Apache Pig 【发布时间】:2013-10-02 13:05:12 【问题描述】:请问在以下示例中,如何显示相同分类和类型的尺寸总和?
((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 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表
非常感谢您的帮助。
谢谢 女士们
【问题讨论】:
【参考方案1】:这里有几个问题。首先,错误消息:这表明 Pig 无法确定要计算哪种SUM
——无论是对整数、浮点数等求和。SUM
的输入应该是一个包,包中的每个元组都包含一个要相加的数字。这对您不起作用,因为包中的每个元组都包含另一个元组。
这给我们带来了第二个问题:您的数据组织。从语义上讲,这里实际上只有三个字段:classification
、type
和一袋size
s。但是您将这三个字段存储在元组中,字段名称在每个元组的第一个元素中重复为chararray
。这会浪费空间并使您的数据更难处理。
您可以投影出袋子元组的单个元素,例如$2.size
,以获得仅包含这些元素的袋子。但是在您的情况下,这不会改变任何事情,因为您包中的每个 size
都不是数字,而是另一个元组,并且无法访问该元组的元素。
你可以通过FLATTEN
ing 包,然后FLATTEN
ing 元组,然后重新GROUP
ing 来解决这个问题,但我认为最好的解决方案是让你进一步了解上游并重组你的数据,所以你没有这种嵌套和无用的字段。
【讨论】:
感谢您的澄清! 您能否告诉我在上述情况下是否可以取消引用大小元组中的值字段?当我第一次使用 //LOAD 'cql://keyspacename/tablename' using CqlStorage // 加载数据时(数据正在从现有的 Cassandra 表中加载),大小元组的模式是 size:(name:chararray, value:int ) 所以我假设我仍然会碰壁,因为我无法使用 SUM 提取值字段? 您可以将元组中的值取消引用为size.value
,但是当这些元组被分组到一个包中时,您就会陷入困境。以上是关于Apache Pig 中的 SUM的主要内容,如果未能解决你的问题,请参考以下文章
无法将 org.apache.pig.builtin.SUM 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表