Apache PIG - GROUP BY的完整结果不会传递给用户定义的函数

时间:2017-05-20 17:41:14

标签: apache-pig user-defined-functions

所以我是Apache PIG的初学者。我正在尝试对一些数据进行分组,然后将分组结果发送到用户定义的函数以进行进一步处理。所以数据是csv,看起来像这样

DAY;STATION;HOUR;TEMPERATURE

我的PIG文件代码:

REGISTER /path/to/jar/myUdf.jar;
weather_data = LOAD 'file:///path/to/file/weather_small.csv' USING PigStorage(';') AS (date:chararray, station:int, hour:int, temperature:Bigdecimal);
by_hour = GROUP weather_data by (hour, date);
DUMP by_hour
to_udf = FOREACH by_hour GENERATE myUdfs.Test();
STORE to_udf INTO 'myoutput' using PigStorage(',');

我的用户定义的功能代码,没有做任何事情导致我没有得到所有数据:

package myUdfs;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class Test extends EvalFunc<String> {
    @Override
    public String exec(Tuple tuple) throws IOException {
        return tuple.toString();
    }
}

这是DUMP命令的输出。这是该组的实际结果。

Output of dump command

最后这是最终reducer输出文件中的数据

((24,11/23/2000),{(11/23/2000,24)})
((24,11/23/2013),{(11/23/2013,24)})
((24,11/27/2009),{(11/27/2009,24)})
((24,11/30/2000),{(11/30/2000,24)})
((24,12/10/2013),{(12/10/2013,24)})
((24,12/13/2009),{(12/13/2009,24)})
((24,12/14/2007),{(12/14/2007,24)})
((24,12/23/2008),{(12/23/2008,24)})
((24,12/24/2007),{(12/24/2007,24)})

如您所见,输出是不同的。站和温度信息未发送到用户定义的功能。但是它存在于原始包中,这是由于随叫随到而产生的。

我需要将所有信息发送到用户定义的函数。因此,温度和电台信息也需要传递给udf

对于长篇文章感到抱歉,但这是我能够清楚解释这个问题的唯一方法。

1 个答案:

答案 0 :(得分:0)

您没有向UDF函数传递任何内容,实际上它有点令人惊讶地自动传递组

尝试

to_udf = FOREACH by_hour GENERATE myUdfs.Test(weather_data);