所以我是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命令的输出。这是该组的实际结果。
最后这是最终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
对于长篇文章感到抱歉,但这是我能够清楚解释这个问题的唯一方法。
答案 0 :(得分:0)
您没有向UDF函数传递任何内容,实际上它有点令人惊讶地自动传递组
尝试
to_udf = FOREACH by_hour GENERATE myUdfs.Test(weather_data);