如何为 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 字段的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中如何用avg函数求出3个月的平均费用

如何为光线投射生成相机光线

如何为 Eclipse 安装 Pig 插件

如何为 Safari 制作 iOS 应用程序扩展以投射视频

组函数AVG(字段)的使用。

Pig如何为列分配名称?