如何计算猪的运行总量?

时间:2013-04-11 23:38:12

标签: apache-pig

有没有办法用Pig计算一个运行总计?

例如,如果我的数据是:

day1, 10
day2, 20
day3, 30

有没有办法生成

day1, 10
day2, 30
day3, 60

4 个答案:

答案 0 :(得分:3)

从PIG 0.12开始,你有Over UDF

https://pig.apache.org/docs/r0.12.0/api/org/apache/pig/piggybank/evaluation/Over.html

所以这个

 A = load 'T';
 B = group A by si
 C = foreach B {
     C1 = order A by d;
     generate flatten(Stitch(C1, Over(C1.f, 'sum(float)')));
 }
 D = foreach C generate s, $9;

将等同于此

select s, sum(f) over (partition by si order by d) from T;

我相信这就是你要找的东西。在您的情况下,您只需要远程分组,或使用ALL组。

答案 1 :(得分:2)

Hive提供了一种非常好的方法来单行执行此操作 -
请按照以下流程实现目标输出

创建 SALES 配置单元表,其中包含您的数据集(日期和销售) -

day   sale
day1, 10
day2, 20
day3, 30

现在只需在您的配置终端中运行以下命令 -

SELECT day, SUM(sale) OVER (ORDER BY DAY) FROM SALES;

输出类似于 -

day1, 10
day2, 30
day3, 60

我希望这可以帮助您获得目标输出。

答案 2 :(得分:1)

我能够使用数据集的交叉产品及其自身来提出解决方案。

示例输入:

{"daynum": "1", "daycount": 5}
{"daynum": "2", "daycount": 10}
{"daynum": "3", "daycount": 7}
{"daynum": "4", "daycount": 8}

猪脚本:

raw = LOAD 'sample.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') as (json:map[]);
dat = FOREACH raw GENERATE (int)json#'daynum' as daynum:int, (int)json#'daycount' as daycount:int;
dat2 = foreach dat generate daynum, daycount;
xp = cross dat, dat2;
xpf = filter xp by (dat::daynum >= dat2::daynum);
grp = group xpf by (dat::daynum);
out = foreach grp generate FLATTEN(group), SUM(xpf.dat2::daycount) as running_total_daycount;
dump out;
(1,5)
(2,15)
(3,22)
(4,30)

答案 3 :(得分:0)

是否有一种有效的方法来计算利用地图减少范例的猪的运行总量?不,我不这么认为。每个条目都依赖于它之前的条目,这意味着并行没有好办法。

是否有可能与猪一起做这件事?是的,您可以将所有数据放入一个包中,然后编写一个可以满足您需要的UDF。如果不是代数,该函数至少可以实现累加器接口。 https://issues.apache.org/jira/browse/PIG-296看起来像是一个旧的 - 从未实现的链接,指向编写UDF的人来做这件事。