2014-04-20 16 views
8

比方說,我JOIN兩個相似關係:如何在Pig中加入後刪除重複的列?

-- 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)

+2

據我所知目前沒有辦法與豬做這個。另外,除了我現在可以想到的解決方案之外,唯一的方法是'FOREACH foo GENERATE FLATTEN(remove(TOTUPLE(*),2));'where'2'是要移除和移除的列的位置是UDF。我認爲你的解決方案要好得多,但是你可以將它縮短爲'FOREACH jnd GENERATE $ 0,$ 1,$ 3 ..''。 – mr2ert

+0

我希望有一種方法可以更輕鬆地完成此操作,但這裏有一個用於手動定義聯接輸出的好語法: http://stackoverflow.com/a/17273031/542620 – Freerobots

回答

2

在處理數據集合和其他數據處理技術時,遇到了同樣的問題,其中輸出列名重複。

因此正在研究UDF,它將通過使用該字段的模式名稱並保留第一個唯一列出現數據來刪除重複列。

先決條件:

所有字段的名稱應該是目前

您需要下載此UDF文件並使其罐子以便使用它。從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:float,DSB :: BRANCH:chararray,DSB :: GRADE:chararray,DSB :: SUB2:float

DSA :: ROLLNO:int,DSA :: CGPA:浮子,DSB :: NAME:chararray,DSB :: SUB1:浮子,DSB :: BRANCH:chararray,DSB :: GRADE:chararray,DS B :: SUB2:float

DSB :: ROLLNO:int被刪除。

我們需要使用UDF作爲

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

哪裏org.imagine.REMOVEDUPLICATECOLUMNS是UDF。

此UDF通過在schema.Style中使用Name來刪除重複列。因此DSA :: ROLLNO:int被保留,並且從數據集中刪除了DSB :: ROLLNO:int。