我是新来的猪,想运行两个聚合函数,但我不确定如何做到这一点。我的数据包括每行一个购买事务,其中我有一个SKU(库存标识符)和客户为该SKU支付的价格(价格可能不同):
sku price_paid
--- ----------
123 21.70
789 62.12
123 22.10
123 19.78
456 11.91
789 55.13
我想生成以下列表,其中包含SKU, SKU的购买次数,以及为该SKU支付的平均价格。该列表应按计数降序排序。
sku count ave_price_paid
--- --------- --------------
123 3 21.19
789 2 58.63
456 1 11.91
任何帮助都会很感激。我目前还没有走远:
A = LOAD 'mydata.csv' USING PigStorage(',') AS (sku:chararray, price_paid:double);
B = GROUP A BY sku;
聚合函数接受一袋值并生成单个值。由于您将要操作的包是由GROUP by语句创建的关系的一部分,因此我将从解释这一点开始。
GROUP BY将对给定键收集具有相同值的所有记录到一个包中(一个包是记录的无序集合)。关系B的记录包含2个字段:
- 键,命名为group (e. sku)
- 收集的记录包,其名称是为分组的别名(关系名称)提供的(即A)。请注意下面您的包是如何"继承"与A相同的模式的。
让我们试着使用DESCRIBE语句,它将向你展示一个关系的模式,例如:
DESCRIBE B;
输出为:
B: {group: chararray,A: {(sku: chararray,price_paid: double)}}
对应上述解释
记住这一点,现在您可以执行以下语句:
C = FOREACH B GENERATE group, COUNT(A) as (count:long), AVG(A.price_paid) as (avg:double);
COUNT计算包中记录的数量,AVG平均作为输入提供的所有值,即包中元组记录的price_paid值(注意您需要访问它们的方式!)
然后执行ORDERING:
D = ORDER C BY count desc;
下面是完整的代码:
A = LOAD 'pathOfYourFile' as (sku:chararray, price_paid:double);
B = GROUP A BY sku;
C = FOREACH B GENERATE group, COUNT(A) as (count:long), AVG(A.price_paid) as (avg:double);
D = ORDER C BY count desc;
有关pig内置函数的更多信息,您可以查看apache参考:http://pig.apache.org/docs/r0.13.0/func.html
这应该能帮到你:
C = FOREACH B GENERATE group, COUNT(A) AS count:long, AVG(A.price_paid) AS avg:double;
D = ORDER C BY count DESC;
解释:
让我们从你已经有的代码开始:
A = LOAD 'mydata.csv' USING PigStorage(',') AS (sku:chararray, price_paid:double);
B = GROUP A BY sku;
现在我们有了关系B,它由两个字段组成:一个组名和它对应的包。组名就是组的名称,比如"123"。这个包将是这个特定组的所有行的列表。例如:
sku bag
---- ----
123 {{123, 21.70}, {123, 22.10}, {123,19.78}}
如果您输入DESCRIBE B;
,那么您应该得到以下内容:
{group: chararray, A: {sku:chararray, price_paid:double}}
在这个模式中,A是一个包,在一个包中可能有许多商品,每个都有一个sku字段和price_paid字段。
现在我们需要使用Pig强大的FOREACH...GENERATE
语句:
C = FOREACH B GENERATE group, COUNT(A) AS count:long, AVG(A.price_paid) AS avg:double;
上面这行表示对于关系B中的每一行,输出:
- 组名
- 组包的
COUNT()
-整个包的行数。使用AS
子句,将此列命名为'count'并使其长。 - 包中所有price_paid字段的
AVG()
。使用AS
子句,将此列命名为'avg',并使其为双精度。
最后:
D = ORDER C BY count DESC;
这将按'count'列降序排序关系C。