Java 如何为GROUPBY编写pig代数udf

Java 如何为GROUPBY编写pig代数udf,java,hadoop,apache-pig,hdfs,Java,Hadoop,Apache Pig,Hdfs,我想编写一个pig代码来执行GROUPBY并生成31个字段的总和,但在此之前,我需要做一些自定义处理,为此我编写了一个eval函数。我想,如果我能将组和求和运算包含到UDF中,我可以使它运行得更快。要做到这一点,我可以使用代数UDF如果是,我的inital()、intermed()和final()返回模式会是什么样子,如果不是,我还可以如何实现它。下面是我的代码,谢谢 a = LOAD './a' using PigStorage('|') AS (val:int, grp1, grp2, am

我想编写一个pig代码来执行GROUPBY并生成31个字段的总和,但在此之前,我需要做一些自定义处理,为此我编写了一个eval函数。我想,如果我能将组和求和运算包含到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';

如何在UDF中执行分组

组正在Pig中转换为MapReduce作业(此作业的中间键将从自定义值、grp1、grp2组合而成)

在Reducer中完成了对某个组的整个元组列表进行迭代(FOREACH)的功能

代数UDF将不“包括组”,但将作为组聚合的一部分执行。所以我认为代数在这里是不相关的

我想您在这里可能要做的唯一优化就是在原始val上分组,并且只在分组之后调用myudfs.Custom(val)

假设您的UDF是一个

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';