3

有没有办法用 Pig 计算总和?

例如,如果我的数据是:

day1, 10
day2, 20
day3, 30

有没有办法生成

day1, 10
day2, 30
day3, 60

?

4

4 回答 4

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。

于 2016-01-11T11:56:18.373 回答
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

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

于 2015-01-19T12:46:53.637 回答
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)
于 2013-04-12T20:51:47.390 回答
0

有没有一种有效的方法来利用 map reduce 范式计算 pig 的运行总数?不,我不这么认为。每个条目都依赖于它之前的条目,这意味着没有并行执行此操作的好方法。

有可能用 Pig 做到这一点吗?是的,你可以做一个 group all 把所有的数据放在一个包里,然后写一个你想要的 UDF。如果不是代数的,该函数至少可以实现累加器接口。 https://issues.apache.org/jira/browse/PIG-296看起来像是一个从未实现过的旧链接,指向编写 UDF 来执行此操作的人。

于 2013-04-12T06:03:25.847 回答