有没有办法用pig计算一个总流量?例如,如果我的数据是:
day1, 10day2, 20day3, 30
day1, 10
day2, 20
day3, 30
有没有办法产生
day1, 10day2, 30day3, 60
day2, 30
day3, 60
?
a0x5cqrl1#
从Pig0.12开始,你就有了超自定义项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;
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;
我相信这就是你要找的。在您的情况下,您只需要远程分组,或者使用group all。
jm81lzqq2#
有没有一种利用map-reduce范式计算pig运行总数的有效方法?不,我不这么认为。每个条目都依赖于它前面的条目,这意味着没有好的方法来并行执行。有可能用Pig来做这个吗?是的,你可以把所有的数据放在一个包里,然后写一个你想要的自定义项。如果不是代数的,那么函数至少可以实现累加器接口。https://issues.apache.org/jira/browse/pig-296 看起来像是一个从未实现的链接,指向一个编写了udf的人。
cvxl0en23#
Hive提供了一个非常好的方式来做这一点在一行-请遵循以下流程来实现您的目标输出创建一个sales配置单元表,其中可以包含您的数据集(day和sale)-
day saleday1, 10day2, 20day3, 30
day sale
现在只需在您的配置单元终端中运行下面的命令-
SELECT day, SUM(sale) OVER (ORDER BY DAY) FROM SALES;
输出如下-
我希望这能帮助你达到目标产量。
hmtdttj44#
我能够利用数据集和它本身的叉积来提出一个解决方案。样本输入:
{"daynum": "1", "daycount": 5}{"daynum": "2", "daycount": 10}{"daynum": "3", "daycount": 7}{"daynum": "4", "daycount": 8}
{"daynum": "1", "daycount": 5}
{"daynum": "2", "daycount": 10}
{"daynum": "3", "daycount": 7}
{"daynum": "4", "daycount": 8}
Pig脚本:
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)
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)
4条答案
按热度按时间a0x5cqrl1#
从Pig0.12开始,你就有了超自定义项
https://pig.apache.org/docs/r0.12.0/api/org/apache/pig/piggybank/evaluation/over.html
所以这个
相当于这个
我相信这就是你要找的。在您的情况下,您只需要远程分组,或者使用group all。
jm81lzqq2#
有没有一种利用map-reduce范式计算pig运行总数的有效方法?不,我不这么认为。每个条目都依赖于它前面的条目,这意味着没有好的方法来并行执行。
有可能用Pig来做这个吗?是的,你可以把所有的数据放在一个包里,然后写一个你想要的自定义项。如果不是代数的,那么函数至少可以实现累加器接口。https://issues.apache.org/jira/browse/pig-296 看起来像是一个从未实现的链接,指向一个编写了udf的人。
cvxl0en23#
Hive提供了一个非常好的方式来做这一点在一行-
请遵循以下流程来实现您的目标输出
创建一个sales配置单元表,其中可以包含您的数据集(day和sale)-
现在只需在您的配置单元终端中运行下面的命令-
输出如下-
我希望这能帮助你达到目标产量。
hmtdttj44#
我能够利用数据集和它本身的叉积来提出一个解决方案。
样本输入:
Pig脚本: