【问题标题】:SUM in Apache PigApache Pig 中的 SUM
【发布时间】: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 的匹配函数推断为多个匹配或都不匹配。请使用显式演员表

非常感谢您的帮助。

谢谢 女士们

【问题讨论】:

    标签: apache-pig


    【解决方案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,但是当这些元组被分组到一个包中时,您就会陷入困境。
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    相关资源
    最近更新 更多