Pig:运行两个聚合函数



我是新来的猪,想运行两个聚合函数,但我不确定如何做到这一点。我的数据包括每行一个购买事务,其中我有一个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个字段:

  1. ,命名为group (e. sku)
  2. 收集的记录包,其名称是为分组的别名(关系名称)提供的(即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中的每一行,输出:

  1. 组名
  2. 组包的COUNT() -整个包的行数。使用AS子句,将此列命名为'count'并使其长。
  3. 包中所有price_paid字段的AVG()。使用AS子句,将此列命名为'avg',并使其为双精度。

最后:

D = ORDER C BY count DESC;

这将按'count'列降序排序关系C。

相关内容

  • 没有找到相关文章

最新更新