如何在Pig中JOIN后删除重复的列?

时间:2014-04-20 05:13:43

标签: java hadoop join apache-pig

让我说我JOIN两个关系如:

-- part looks like:
-- 1,5.3
-- 2,4.9
-- 3,4.9

-- original looks like:
-- 1,Anju,3.6,IT,A,1.6,0.3
-- 2,Remya,3.3,EEE,B,1.6,0.3
-- 3,akhila,3.3,IT,C,1.3,0.3

jnd = JOIN part BY $0, original BY $0;

输出将是:

1,5.3,1,Anju,3.6,IT,A,1.6,0.3
2,4.9,2,Remya,3.3,EEE,B,1.6,0.3
3,4.9,3,akhila,3.3,IT,C,1.3,0.3

请注意,$0在每个元组中显示两次。 EG:

1,5.3,1,Anju,3.6,IT,A,1.6,0.3
^     ^
|-----|

我可以通过执行以下操作手动删除重复密钥:

jnd = foreach jnd generate $0,$1,$3,$4 ..;

有没有办法动态删除它?与remove(the duplicate key joiner)一样。

1 个答案:

答案 0 :(得分:2)

在处理数据集连接和其他数据处理技术时遇到了同样的问题,在输出中,列名重复出现。

因此正在研究UDF,它将使用该字段的模式名称删除重复列,并保留第一个唯一的列发生数据。

<强>先决条件:

所有字段的名称应该存在

您需要下载此UDF文件并将其设为jar以便使用它。

来自GitHub的UDF文件位置GitHub UDF Java File Location

我们将以上述问题为例。

--Data Set A contains this data
-- 1,5.3
-- 2,4.9
-- 3,4.9

--Data Set B contains this data
-- 1,Anju,3.6,IT,A,1.6,0.3
-- 2,Remya,3.3,EEE,B,1.6,0.3
-- 3,Akhila,3.3,IT,C,1.3,0.3

PIG脚本:

REGISTER /home/user/
DSA = LOAD '/home/user/DSALOC' AS (ROLLNO:int,CGPA:float);
DSB = LOAD '/home/user/DSBLOC' AS (ROLLNO:int,NAME:chararray,SUB1:float,BRANCH:chararray,GRADE:chararray,SUB2:float);
JOINOP = JOIN DSA BY ROLLNO,DSB BY ROLLNO;

我们将在加入后获得列名称 DSA :: ROLLNO:INT,DSA :: CGPA:浮动,DSB :: ROLLNO:INT,DSB ::名称:chararray,DSB :: SUB1:浮动,DSB ::分公司:chararray,DSB ::等级:chararray,DSB :: SUB2:浮

制作它 DSA :: ROLLNO:整数,DSA :: CGPA:浮子,DSB :: NAME:chararray,DSB :: SUB1:浮子,DSB :: BRANCH:chararray,DSB :: GRADE:chararray,DSB :: SUB2:浮

DSB :: ROLLNO:删除了int。

我们需要将UDF用作

JOINOP_NODUPLICATES = FOREACH JOINOP GENERATE FLATTEN(org.imagine.REMOVEDUPLICATECOLUMNS(*));

org.imagine.REMOVEDUPLICATECOLUMNS是UDF。

此UDF通过在schema中使用Name来删除重复列。因此,DSA :: ROLLNO:int被保留,并且DSB :: ROLLNO:int将从数据集中删除。