让我说我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)
一样。
答案 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将从数据集中删除。