有没有一种方法可以用Pig来计算跑步总数?如何计算猪的跑步总数?
例如,如果我的数据是:
day1, 10
day2, 20
day3, 30
是有办法产生
day1, 10
day2, 30
day3, 60
?
有没有一种方法可以用Pig来计算跑步总数?如何计算猪的跑步总数?
例如,如果我的数据是:
day1, 10
day2, 20
day3, 30
是有办法产生
day1, 10
day2, 30
day3, 60
?
有没有一种有效的方式来计算猪的跑步总数,利用地图缩小范例?不,我不这么认为。每个条目都依赖于它之前的条目,这意味着没有好的方法可以并行执行此操作。
是否可以用猪来做到这一点?是的,你可以把所有的数据放到一个包里,然后编写一个你想要的UDF。如果不是代数的话,该函数至少可以实现累加器接口。 https://issues.apache.org/jira/browse/PIG-296看起来像一个从未实现过的链接给一个编写UDF的人来做这件事。
我能够拿出一个解决方案,使用数据集和它自己的交叉产品。
样品输入:
{"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)
尽管这样效率很低。你把一个O(n)问题变成O(n^2),这样它就可以在猪身上完成。除非你拥有无限的主机,并且没有预算,否则只需通过主节点上的原始文件进行流式处理,然后用累计总数写入新文件,然后将其用作猪的输入。 – DMulligan
蜂巢提供了一个很好的方式在单行做到这一点 -
请按照以下流程来实现你的目标输出
创建一个销售配置单元表可以包含您的数据集(天,和销售) -
day sale
day1, 10
day2, 20
day3, 30
现在,只需在您的蜂巢终端中运行以下命令 -
SELECT day, SUM(sale) OVER (ORDER BY DAY) FROM SALES;
输出会像 -
day1, 10
day2, 30
day3, 60
我希望这可以帮助你得到你的目标输出。
与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。
如果您觉得在配置单元中写入不好,为什么不能直接写一个UDF,它将保存最后一个SUM值以添加新值? – Bector