如何为 AVG 函数投射 Pig 字段
Posted
技术标签:
【中文标题】如何为 AVG 函数投射 Pig 字段【英文标题】:How to cast Pig field for AVG function 【发布时间】:2014-08-29 01:06:17 【问题描述】:我正在尝试在Titanic data 上使用一些 Pig 函数。在某一时刻,我将其缩小到乘客等级和票价(票价):
代码如下:
sh echo "1. create FarePclass with two fields"
FarePclass = FOREACH train GENERATE Pclass,Fare ;
DUMP FarePclass;
sh echo "2. create FareByClass grouping by Pclass"
FareByPclass = GROUP FarePclass BY Pclass ;
--FareByPclass = GROUP FarePclass ALL;
--DUMP FareByPclass;
DESCRIBE FareByPclass;
sh echo "3. get average"
AvgFareByPclass = FOREACH FareByPclass GENERATE (float) SUM(FarePclass.Fare);
以下是第 1 步中 DUMP 语句的一些示例行和输出:
(2,10.5)
(3,7.05)
(3,29.125)
(2,13)
(1,30)
(3,23.45)
(1,30)
(3,7.75)
2. create FareByClass grouping by Pclass
FareByPclass: group: chararray,FarePclass: (Pclass: chararray,Fare: chararray)
3. get average
2014-08-28 20:56:23,288 ERROR org.apache.pig.tools.grunt.Grunt: ERROR 1045:
<file titanic_dypler_datafu.pig, line 36, column 56> Could not infer the matching function for org.apache.pig.builtin.SUM as multiple or none of them fit. Please use an explicit cast.
我有这个脚本,我正在尝试运行最后一行。 AvgFareByPclass= FOREACH FareByPclass GENERATE (float) SUM(FarePclass.Fare);
尝试运行时出现此错误: 无法将带有架构的包 :bag:tuple(Fare:chararray) 转换为浮动。
你能建议如何转换 FarePclass.Fare 吗?我是否在概念上遗漏了一些关于如何去做的事情?
【问题讨论】:
【参考方案1】:在您已经尝试将它们相加之后,再尝试将 chararray Fares 转换为浮点数已经太迟了;他们需要是数字,然后你才能得到他们的总和。进行转换的最明智的地方可能是对 FarePclass 的第一个投影:
FarePclass = FOREACH train GENERATE Pclass,(float)Fare ;
【讨论】:
谢谢乔纳森,这解决了我的问题。如果有人想知道,泰坦尼克号的平均票价是: 头等舱:84.15 美元 二等舱:21.66 美元 三等舱:13.67 美元。顺便说一句,我最初的目标是计算平均值,但我决定先让 SUM 工作,以防你注意到名称和函数调用之间的不匹配。再次感谢。以上是关于如何为 AVG 函数投射 Pig 字段的主要内容,如果未能解决你的问题,请参考以下文章