我的数据集中的每一行都是销售,我的目标是计算客户在其生命周期内购买的平均时间。
我已经按照这样的方式对clientId进行了分组和计数:
byClientId = GROUP sales BY clientId;
countByClientId = FOREACH byClientId GENERATE group, count($1);
这将创建一个包含2列的表:clientId,Transactions of transactions。
现在,我试图获得第二列的总平均值(即同一客户的销售总体平均值)。我正在使用此代码:
groupCount = GROUP countByClientId all;
avg = foreach groupCount generate AVG($1);
但我收到此错误消息:
[main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1045:
<line 18, column 31> Could not infer the matching function for org.apache.pig.builtin.AVG
as multiple or none of them fit. Please use an explicit cast.
如何获得第二列的整体平均值?
答案 0 :(得分:1)
对于我们来说,输入数据的样本会更简单。我创建了自己的,以确保我的解决方案能够正常工作。您只有一个错误:一旦您将所有架构分组为group:chararray,countByClientId:bag{:tuple(group:chararray,:long)}
所以,$ 1指的是一个包,这就是你无法计算平均值的原因。如果您想要在此包中访问$ 1(这是第二个元素),您有两个选择,$1.$1
或countByClientId.$1
。所以你的最后一行应该是:
avg = foreach groupCount generate AVG(countByClientId.$1);
我希望它很清楚。