发送与UDF函数的关系

时间:2014-06-03 17:43:06

标签: apache-pig

我可以将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可以帮助我。

2 个答案:

答案 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