假设我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在每个元组中显示两次。例如:
1,5.3,1,Anju,3.6,IT,A,1.6,0.3
^     ^
|-----|

我可以通过以下操作手动删除重复的 key :
jnd = foreach jnd generate $0,$1,$3,$4 ..;

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

最佳答案

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

因此,正在使用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:float,DSB::ROLLNO:int,DSB::NAME:chararray,DSB::SUB1:float,DSB::BRANCH:chararray,DSB::GRADE:chararray,DSB::SUB2:float

为了做到
DSA::ROLLNO:int,DSA::CGPA:float,DSB::NAME:chararray,DSB::SUB1:float,DSB::BRANCH:chararray,DSB::GRADE:chararray,DSB::SUB2:float

DSB::ROLLNO:int被删除。

我们需要使用UDF作为
JOINOP_NODUPLICATES = FOREACH JOINOP GENERATE FLATTEN(org.imagine.REMOVEDUPLICATECOLUMNS(*));

其中org.imagine.REMOVEDUPLICATECOLUMNS是UDF。

该UDF通过在架构中使用Name来删除重复的列。因此保留了DSA::ROLLNO:int并从数据集中删除了DSB::ROLLNO:int。

07-25 22:25