2015-07-28 67 views
1

我是Apache Pig的新手。我想將以下輸入分割並拼合成我所需的輸出,例如誰都可以看到該產品。無法避免重複刪除Apache Pig

我輸入:(用戶ID,產品編號)

12345 123456,23456,987653 
23456 23456,123456,234567 
34567 234567,765678,987653 

我所需的輸出:(產品編號,用戶ID)

123456 12345 
123456 23456 
23456 12345  
23456 23456 
987653 12345 
987653 34567 
234567 23456 
234567 34567 
765678 34567 

我的豬腳本:

a = load '/home/hadoopuser/ips' using PigStorage('\t') as (key:chararray, val:chararray); 
b = foreach a generate key as ky1, FLATTEN(TOKENIZE(val)) as vl1; 
c = group b by vl1; 
d = foreach c generate group as vl2, $1 as ky2; 
e = foreach d generate vl2, BagToString(ky2) as kyy; 
f = foreach e generate vl2 as vl3,FLATTEN(STRSPLIT(kyy,'_')) as ky3; 
g = foreach f generate vl3, FLATTEN(TOKENIZE(ky3)) as kk1; 
dump g; 

我得到了以下輸出消除重複(重複)值,

(23456,12345) 
(123456,12345) 
(234567,23456) 
(765678,34567) 
(987653,12345) 

我不知道如何解決這個問題。任何人都可以幫我解決這個問題嗎?以及如何以簡單的方式做到這一點?

回答

0

好吧,代碼的第二行完全符合你的要求,它只是簡單地顯示客戶第一和產品。把第一FLATTEN,然後key部分:

a = load '/home/hadoopuser/ips' using PigStorage('\t') as (key:chararray, val:chararray); 
b = foreach a generate FLATTEN(TOKENIZE(val)) as ProductId, key as UserId; 
dump b; 

(123456,12345) 
(23456,12345) 
(987653,12345) 
(23456,23456) 
(123456,23456) 
(234567,23456) 
(234567,34567) 
(765678,34567) 
(987653,34567) 

至於爲什麼你每次對產品編號只有一個結果與當前的代碼,你是產品編號,讓您根據不同ProductId一行與包分組其中包含所有查看該產品的客戶。然後,你那袋再次轉換到由_分開了巨大的字符串,將其轉換爲同一個袋子裏前:

d = foreach c generate group as vl2, $1 as ky2; 
e = foreach d generate vl2, BagToString(ky2) as kyy; 
f = foreach e generate vl2 as vl3,FLATTEN(STRSPLIT(kyy,'_')) as ky3; 

BagToString UDF包轉換爲字符串,在分離袋中加入不同的值通過自定義分隔符,默認爲_。然而,在下一行中,您將它拆分爲_,結果與之前相同。但是,您的包包中包含的所有客戶都是FLATTEN,所以現在您不必使用ProductId和包包連續排列,而是包含多個字段的行,即第一個ProductId,以及以下所有查看該產品的客戶的字段:

FLATTEN前:

(23456,{(23456,23456),(12345,23456)}) 
(123456,{(23456,123456),(12345,123456)}) 
(234567,{(34567,234567),(23456,234567)}) 
(765678,{(34567,765678)}) 
(987653,{(34567,987653),(12345,987653)}) 

後FLATTEN:

(23456,23456,23456,12345,23456) 
(123456,23456,123456,12345,123456) 
(234567,34567,234567,23456,234567) 
(765678,34567,765678) 
(987653,34567,987653,12345,987653) 

而這就是錯誤。每個產品只有一行,每個客戶每行有幾個字段。當應用最後一個foreach時,您選擇第一個字段(產品)和第二個(所有客戶的第一個),放棄每行其餘客戶。

+0

Hi Balduz,謝謝你的回覆。它的工作正常,我清楚地解釋了這個問題。 –