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 的输入应该是一个包,包中的每个元组都包含一个要相加的数字。这对您不起作用,因为包中的每个元组都包含另一个元组。

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

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

你可以通过FLATTENing 包,然后FLATTENing 元组,然后重新GROUPing 来解决这个问题,但我认为最好的解决方案是让你进一步了解上游并重组你的数据,所以你没有这种嵌套和无用的字段。

【讨论】:

感谢您的澄清! 您能否告诉我在上述情况下是否可以取消引用大小元组中的值字段?当我第一次使用 //LOAD 'cql://keyspacename/tablename' using CqlStorage // 加载数据时(数据正在从现有的 Cassandra 表中加载),大小元组的模式是 size:(name:chararray, value:int ) 所以我假设我仍然会碰壁,因为我无法使用 SUM 提取值字段? 您可以将元组中的值取消引用为size.value,但是当这些元组被分组到一个包中时,您就会陷入困境。

以上是关于Apache Pig 中的 SUM的主要内容,如果未能解决你的问题,请参考以下文章

Pig 脚本中的 SUM 函数

PIG 中的 SUM 函数

无法将 org.apache.pig.builtin.SUM 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表

删除 apache pig 中的重复行

Apache Pig 中的 HCatalog 可以只加载特定分区吗?

Apache Pig 中的按位运算?