发送与udf函数的关系

nle07wnf  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(307)

我可以发送一个与pig udf函数的关系作为输入吗?关系中可以有多个元组。如何在pig udf函数中逐个读取每个元组?
下面是我的示例输入文件。

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;

我所需要的只是关于每家公司薪水最高的雇员的详细资料。我该如何使用自定义项呢?
我需要这样的东西

CTS     Karthic,HDFC,95000,CTS
TCS     Raja,AXIS,80000,TCS

有人能帮我吗。

s5a0g9ez

s5a0g9ez1#

此脚本将为您提供所需的结果:

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),(kumar,axis,70000,cts),(remya,axis,40000,cts),(ankur,hdfc,80000,cts),(karthic,hdfc,95000,cts),(sandhya,axis,60000,cts),(amit,sbi,70000,cts)})
(tcs,{(raja,axis,80000,tcs),(raj,hdfc,70000,tcs),(arun,sbi,30000,tcs),(vimal,sbi,10000,tcs)})
然后我们说,对于b中的每个元组,根据第2列的值,即amt,从b中找到的关系a生成另一个元组结果,该结果等于前1个记录。列从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
qc6wkl3g

qc6wkl3g2#

您不需要编写自定义项就可以做到这一点,只需使用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));

相关问题