获取 Apache Pig 中每 N 个元组的平均值
Get average value for every N tuples in Apache Pig
假设我有一个包含两列 CUSTTYPE 和 AMOUNT 的 table。我想添加第三列 NTILE 然后我可以对其进行分组并使用它来获得我的平均值,如下所示:
CUSTTYPE | AMOUNT | NTILE
----------+---------+----------
RETAIL | 78.00 | 1
RETAIL | 234.00 | 1
RETAIL | 249.00 | 1
RETAIL | 278.00 | 2
RETAIL | 392.00 | 2
RETAIL | 498.00 | 2
RETAIL | 500.00 | 3
RETAIL | 738.00 | 3
RETAIL | 1250.00 | 3
RETAIL | 2029.00 | 4
RETAIL | 2393.00 | 4
RETAIL | 3933.00 | 4
本质上,我试图取每 n 个项的平均值(这里,n=3):
CUSTTYPE | AMOUNT | NTILE
----------+---------+----------
RETAIL | 187.00 | 1
RETAIL | 389.33 | 2
RETAIL | 829.33 | 3
RETAIL | 2785.0 | 4
从 Pig 参考资料 here 看来,这似乎可以使用 Over()
来实现,但我找不到如何完成此操作的示例。想法?
您可以使用 RANK
运算符对数据的每条记录进行排名:
http://pig.apache.org/docs/r0.14.0/basic.html#rank
像这样:
A = LOAD 'path' AS (schema);
B = RANK A;
然后将每个排名除以 3:
C = FOREACH B generate ([=11=] + 1) / 3 as NTILE, CUSTTYPE, AMOUNT;
假设我有一个包含两列 CUSTTYPE 和 AMOUNT 的 table。我想添加第三列 NTILE 然后我可以对其进行分组并使用它来获得我的平均值,如下所示:
CUSTTYPE | AMOUNT | NTILE
----------+---------+----------
RETAIL | 78.00 | 1
RETAIL | 234.00 | 1
RETAIL | 249.00 | 1
RETAIL | 278.00 | 2
RETAIL | 392.00 | 2
RETAIL | 498.00 | 2
RETAIL | 500.00 | 3
RETAIL | 738.00 | 3
RETAIL | 1250.00 | 3
RETAIL | 2029.00 | 4
RETAIL | 2393.00 | 4
RETAIL | 3933.00 | 4
本质上,我试图取每 n 个项的平均值(这里,n=3):
CUSTTYPE | AMOUNT | NTILE
----------+---------+----------
RETAIL | 187.00 | 1
RETAIL | 389.33 | 2
RETAIL | 829.33 | 3
RETAIL | 2785.0 | 4
从 Pig 参考资料 here 看来,这似乎可以使用 Over()
来实现,但我找不到如何完成此操作的示例。想法?
您可以使用 RANK
运算符对数据的每条记录进行排名:
http://pig.apache.org/docs/r0.14.0/basic.html#rank
像这样:
A = LOAD 'path' AS (schema);
B = RANK A;
然后将每个排名除以 3:
C = FOREACH B generate ([=11=] + 1) / 3 as NTILE, CUSTTYPE, AMOUNT;