2013-04-11 44 views
3

有没有一种方法可以用Pig来计算跑步总数?如何计算猪的跑步总数?

例如,如果我的数据是:

day1, 10 
day2, 20 
day3, 30 

是有办法产生

day1, 10 
day2, 30 
day3, 60 

+0

如果您觉得在配置单元中写入不好,为什么不能直接写一个UDF,它将保存最后一个SUM值以添加新值? – Bector

回答

0

有没有一种有效的方式来计算猪的跑步总数,利用地图缩小范例?不,我不这么认为。每个条目都依赖于它之前的条目,这意味着没有好的方法可以并行执行此操作。

是否可以用猪来做到这一点?是的,你可以把所有的数据放到一个包里,然后编写一个你想要的UDF。如果不是代数的话,该函数至少可以实现累加器接口。 https://issues.apache.org/jira/browse/PIG-296看起来像一个从未实现过的链接给一个编写UDF的人来做这件事。

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) 
+2

尽管这样效率很低。你把一个O(n)问题变成O(n^2),这样它就可以在猪身上完成。除非你拥有无限的主机,并且没有预算,否则只需通过主节点上的原始文件进行流式处理,然后用累计总数写入新文件,然后将其用作猪的输入。 – DMulligan

2

蜂巢提供了一个很好的方式在单行做到这一点 -
请按照以下流程来实现你的目标输出

创建一个销售配置单元表可以包含您的数据集(天,和销售) -

day sale 
day1, 10 
day2, 20 
day3, 30 

现在,只需在您的蜂巢终端中运行以下命令 -

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

输出会像 -

day1, 10 
day2, 30 
day3, 60 

我希望这可以帮助你得到你的目标输出。

3

与PIG 0.12开始,你有过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。