hadoop - pig : Running two aggregation functions

标签 hadoop mapreduce apache-pig

我是 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. 一个 key ,被命名为组(即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 平均所有作为输入提供的值,e.i.包中元组记录的 price_paid 值(请注意您需要访问它们的方式!)

然后您执行订购:

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

关于hadoop - pig : Running two aggregation functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24743487/

相关文章:

java - SPARK 驱动程序在读取多个 S3 文件时内存不足

hadoop - hadoop jar 和 yarn -jar 的区别

hadoop - 在不上传到HDFS的情况下访问本地文件系统

hadoop - 分析MapReduce作业

python - 我可以使用什么语言来快速执行此数据库汇总任务?

hadoop - 我现在如何锁定 hbase?

hadoop - MapReduce 程序的输入文件是强制性的吗?

hadoop - 无法创建 HDFS admin super 用户

hadoop - PIG UDF 抛出错误

hadoop - 筛选出PIG中的重复项