ApachePig的总和

jtjikinw  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(297)

我怎样才能在下面的例子中显示相同分类和类型的大小之和? ((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中上述关系的描述函数的输出; {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的匹配函数推断为多个或没有匹配的函数。请使用显式强制转换
你的帮助将不胜感激。
谢谢,小姐

r6hnlfcb

r6hnlfcb1#

你有几个问题。首先,错误消息:这表示pig无法确定哪种类型的 SUM 计算——是否对输入的整数、浮点等求和 SUM 应该是一个包,包中的每个元组都包含一个要求和的数字。这不适用于您,因为包中的每个元组都包含另一个元组。
这就带来了第二个问题:您的数据组织。从语义上讲,这里实际上只有三个字段: classification , type ,还有一袋 size s。但是您存储的这三个字段是用元组 Package 的,字段的名称被复制为 chararray 在每个元组的第一个元素中。这会浪费空间,使数据更难处理。
你可以投射出一个包元组的单个元素,比如 $2.size 为了得到一包这些元素。但对你来说,这不会改变什么因为 size 在您的包中不是一个数字,而是另一个元组,无法访问这个元组的元素。
你可以通过 FLATTEN 打开袋子,然后 FLATTEN 重新计算元组,然后重新- GROUP 但我认为最好的解决方案是进一步向上游看,重新构造数据,这样就不会有这种嵌套和无用的字段。

相关问题