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



假设I 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
^     ^
|-----|

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

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

有没有一种方法可以动态地删除它?像remove(the duplicate key joiner)

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

UDF也是如此,它将通过使用该字段的模式名称来删除重复的列,并保留第一个唯一的列出现数据。

先决条件:

所有字段的名称应存在

你需要下载这个UDF文件并使其jar以便使用它

GitHub中的UDF文件位置:GitHub UDF Java文件位置

我们将以上述问题为例。

--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:foat,DSB::ROLLNO:int,DSB::名称:字符阵列,DSB::SUB1:浮点,DSB::BRANCH:字符阵列,DSB::GRADE:字符阵列

为了让它DSA::ROLLNO:int,DSA::CGPA:浮点,DSB::NAME:字符阵列,DSB:::SUB1:浮点,DSB::BRANCH:字符阵列

DSB::ROLLNO:int已删除。

我们需要使用UDF作为

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

其中org.imagine.REMOVEDUPLICATECOLUMS是UDF。

此UDF通过在架构中使用名称来删除重复列。因此,将保留DSA::ROLLNO:int,并从数据集中删除DSB::ROLLNO:int。

最新更新