【问题标题】:How to remove duplicate columns after a JOIN in Pig?如何在猪中加入后删除重复的列?
【发布时间】:2014-04-20 05:13:42
【问题描述】:

假设我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)

【问题讨论】:

  • 据我所知,Pig 目前无法做到这一点。此外,除了您当前的解决方案之外,我能想到的唯一方法是FOREACH foo GENERATE FLATTEN(remove(TOTUPLE(*), 2));,其中2 是要删除的列的位置,remove 是一个UDF。我认为您的解决方案要好得多,但是您可以将其缩短为 FOREACH jnd GENERATE $0, $1, $3 ..;
  • 我希望有一种方法可以更轻松地做到这一点,但这里有一个很好的语法来手动定义连接的输出:stackoverflow.com/a/17273031/542620

标签: java hadoop join apache-pig


【解决方案1】:

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

因此正在研究 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:浮点数

为了让它 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 使用架构中的名称删除重复列。因此 DSA::ROLLNO:int 被保留,DSB::ROLLNO:int 被从数据集中删除。

【讨论】:

    猜你喜欢
    • 2020-08-20
    • 2016-09-07
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多