我想写一个pig代码来执行group by并生成31个字段的总和,但在此之前我需要做一些自定义处理,我写了一个eval函数。我想如果我能将GROUP和SUM操作包含在UDF中,我可以让它运行得更快。要做到这一点,我可以使用代数UDF,如果是,我的返回模式inital(),intermed()和final()如何,如果没有其他我可以实现这一点。下面是我的代码和谢谢。
a = LOAD './a' using PigStorage('|') AS (val:int, grp1, grp2, amt1:long, amt2:long, amt3 ... amt31:long);
b = FOREACH a GENERATE myudfs.Custom(val) AS custom_val, grp1, grp2, amt1 ... amt31;
c = GROUP b BY (custom_val,grp1, grp2);
d = FOREACH c GENERATE group, SUM(b.amt1) ... SUM(b.amt31);
store d into './op';
答案 0 :(得分:-1)
如何在UDF中执行GROUP??
GROUP正在Pig中转换为MapReduce作业(此作业的中间键将由custom_val,grp1,grp2组合而成)。
在Reducer中完成了对特定组的整个元组列表进行迭代(FOREACH)的能力。
代数UDF不会“包含GROUP”,但会作为GROUP聚合的一部分执行。所以我认为代数在这里不相关。
我想你可能在这里做的唯一优化就是对原始的val进行分组,并且只在GROUP之后调用myudfs.Custom(val)。
假设您的UDF是injective function 。
a = LOAD './a' using PigStorage('|') AS (val:int, grp1, grp2, amt1:long, amt2:long, amt3 ... amt31:long);
c = GROUP b BY (val,grp1, grp2);
d = FOREACH c GENERATE myudfs.Custom(group) AS custom_val, SUM(b.amt1) ... SUM(b.amt31);
store d into './op';