2015-05-19 45 views
1

我無法在Pig中找到這個看似簡單的問題的解決方案。將行添加到Pig中的表中

我有一個表,看起來像:

(USA, "big",somevalue1) 
(USA, "rich",somevalue2) 
(RU, "big",somevalue3) 
(BR, "rich",somevalue4) 
(BR, "rich",somevalue5) 

作爲輸出我想

(USA, "big",somevalue1) 
(USA, "rich",somevalue2) 
(RU, "big",somevalue3) 
(RU, "rich",0) 
(BR, "rich",somevalue4) 
(BR, "rich",somevalue5) 
(BR, "big",0) 

即,使得每個國家共享相同的「信息」相對於第二列添加行,即使這意味着填充零未知值。

編輯

這是我想出瞭解決方案

USA "big" 1 
USA "rich" 2 
RU "big" 3 
BR "rich" 4 
BR "rich" 5 

(輸入example.txt中)

A = LOAD 'example.txt' USING PigStorage('\t') AS (cty: chararray, prop:chararray, value: int); 
B = FOREACH A GENERATE cty; 
B = DISTINCT B; 
C = FOREACH A GENERATE prop; 
C = DISTINCT C; 
D = CROSS B, C; 

X = JOIN D BY (cty,prop) LEFT, A BY (cty,prop) using 'replicated'; 
K = FOREACH X GENERATE 
       B::cty AS cty, 
       C::prop AS prop, 
       (value is NULL ? 0 : value); 
DUMP K; 

預期其中給出:

(USA,"rich",2) 
(USA,"big",1) 
(RU,"rich",0) 
(RU,"big",3) 
(BR,"rich",4) 
(BR,"rich",5) 
(BR,"big",0) 

回答

2

我相信最簡單的方法是按照第一個字段進行分組,然後將每個組分組,將相關的包發送到您自己的UDF中,該UDF將遍歷包中的元組,並將返回一個包含現有元組的新包+需要時的默認元組。

爲了創建第二個字段(「utility_bag」)所需值的列表,您可以使用distinct和ALL分組。

這裏是你的腳本看起來應該像:

input_data = LOAD 'input.csv' USING PigStorage('\t') 
       AS (country:chararray, f2:chararray, somevalue:chararray); 

only_second_field = FOREACH input_data GENERATE f2; 
distinct_list = DISTINCT only_second_field; 
utility_bag = GROUP distinct_list ALL; 

grouped = FOREACH (GROUP input_data BY country) 
    GENERATE group, CustomUDF(input_data, utility_bag.distinct_list) AS enhancedBag; 

result = FOREACH grouped GENERATE flatten(enhancedBag); 

您的自定義UDF應該獲得2個參數:

  1. 袋與原來的架構:{(國:chararray,F2:chararray ,someValue中:chararray)}
  2. 袋與架構:{(F2:chararray)}
    例如:{(大),(富),(孤獨)}
    • 爲了消除元組並僅留下值,您可以稍微玩一下這個包。

關於你想出了一個解決方案,這是件好事,但它是不是很有效,因爲交叉的使用和JOIN操作,這是與額外的MapReduce作業造成。

您可以在本系列中瞭解何時避免在豬中使用CROSS:http://blog.mortardata.com/post/74952451884/why-did-the-pig-cross-the-join-part-4

希望它能幫到您。

+0

我不知道默認的元組。在我的例子中,我不知道每個國家必須出現一套{「大」,「富」}。這個集合可能像{「big」,「rich」,「oil」}更大。我需要首先隔離「最大」集... – fricadelle

+0

我不知道這是一個無限的值列表,而不僅僅是「大」和「富」。所以我編輯了我的答案,並詳細解決了您的問題。希望它能完成這項工作。 –