我可以将Pig UDF函数的关系作为输入发送吗?关系可以包含多个元组。我们如何在Pig UDF函数中逐个读取每个元组?
好的.Below是我的Sample输入文件。
Surender,HDFC,60000,CTS
Raja,AXIS,80000,TCS
Raj,HDFC,70000,TCS
Kumar,AXIS,70000,CTS
Remya,AXIS,40000,CTS
Arun,SBI,30000,TCS
Vimal,SBI,10000,TCS
Ankur,HDFC,80000,CTS
Karthic,HDFC,95000,CTS
Sandhya,AXIS,60000,CTS
Amit,SBI,70000,CTS
myinput = LOAD '/home/cloudera/surender/laurela/balance.txt' USING PigStorage(',') AS(name:chararray,bank:chararray,amt:long,company:chararray);
grouped = GROUP myinput BY company;
我需要的是每家公司中收入最高的员工的详细信息。我如何使用UDF?
我需要这样的东西
CTS Karthic,HDFC,95000,CTS
TCS Raja,AXIS,80000,TCS
SomeOne可以帮助我。
答案 0 :(得分:0)
您不需要编写UDF来执行此操作,只需使用pig中的top函数执行此操作:http://pig.apache.org/docs/r0.11.0/func.html#topx
以下是应该工作(未经测试)的代码示例:
grouped = GROUP myinput BY company;
result = FOREACH grouped GENERATE company, FLATTEN(TOP(1,2,grouped));
答案 1 :(得分:0)
此脚本将为您提供所需的结果:
A = LOAD '/home/cloudera/surender/laurela/balance.txt' USING PigStorage(',') AS(name:chararray,bank:chararray,amt:long,company:chararray);
B = GROUP A BY (company);
topResults = FOREACH B {result = TOP(1, 2, A); GENERATE FLATTEN(result);}
dump topResults;
首先我们在公司的基础上对A进行分组。所以A是:
(CTS,{(Surender,HDFC,60000,CTS),(库马尔,AXIS,70000,CTS),(Remya,AXIS,40000,CTS),(ANKUR,HDFC,80000,CTS),(Karthic, HDFC,95000,CTS),(桑德亚,AXIS,60000,CTS),(阿密特,SBI,70000,CTS)})
(TCS,{(拉加,AXIS,80000,TCS),(拉吉,HDFC,70000,TCS),(阿伦,SBI,30000,TCS),(VIMAL,SBI,10000,TCS)})
然后我们说B中的foreach元组,生成另一个元组结果,它等于 A 记录中的 A 记录B基于第2列的值即amt。列从0开始编号。
注意强> 首先,您的数据在公司名称后面有额外的空格请删除多余的空格或使用以下数据:
Surender,HDFC,60000,CTS
Raja,AXIS,80000,TCS
Raj,HDFC,70000,TCS
Kumar,AXIS,70000,CTS
Remya,AXIS,40000,CTS
Arun,SBI,30000,TCS
Vimal,SBI,10000,TCS
Ankur,HDFC,80000,CTS
Karthic,HDFC,95000,CTS
Sandhya,AXIS,60000,CTS
mit,SBI,70000,CTS