2015-06-22 43 views
0

認爲這是我的投入,如何在PIG中使用FILTER獲取for循環中的匹配值?

Input (File1): 
12345;11 
34567;12 
. 
. 

Input (File2): 
11;(1,2,3,4,5,6,7,8,9) 
12;(9,8,7,6,5,4,3,2,1) 
. 
. 

我希望得到的輸出如下:

Output: 
(1,2,3,4,5,6,7,8,9) 
(9,8,7,6,5,4,3,2,1) 

下面是我所使用FILTER嘗試示例代碼和我面對這一些錯誤。請建議我一些其他選項。

data1 = load '/File1' using PigStorage(';') as (id,number); 
data2 = load '/File2' using PigStorage(';') as (numberInfo, collection); 

out = foreach data1{ 
Data_filter = FILTER data2 by (numberInfo matches CONCAT(number,'')); 
generate Data_filter; 
} 

是否可以在for循環中執行此操作?請告訴我。提前致謝 !

回答

1

Apache Pig中沒有for循環,如果您需要遍歷數據的每一行以用於實現您自己的UDF所需的特定目的。 foreach關鍵字不用於創建循環,它用於根據您的列轉換數據,並向其應用UDF。您也可以使用嵌套的foreach,您可以在關係中的每個組上執行操作。

但是,您的語法錯誤。您正嘗試使用嵌套的foreach,而無需先將數據分組。嵌套的foreach所執行的操作是通過分組關係執行您在代碼塊中定義的操作。因此,只有你的代碼可能工作方式是首先對數據進行分組:

data1 = load '/File1' using PigStorage(';') as (id,number); 
data2 = load '/File2' using PigStorage(';') as (numberInfo, collection); 

data1 = group data1 by id; 

out = foreach data1{ 
    Data_filter = FILTER data2 by (numberInfo matches CONCAT(number,'')); 
    generate Data_filter; 
} 

然而,這並不會因爲一個嵌套foreach你不能指像data2不同的關係在裏面工作。

你真正想要的,是比使用numberdata1numberInfodata2雙方關係JOIN操作。這會給你這樣的:

joined_data = join data1 by number, data2 by numberInfo; 

dump joined_data; 
(12345,11,11,(1,2,3,4,5,6,7,8,9)) 
(34567,12,12,(9,8,7,6,5,4,3,2,1)) 

在你的問題,你說你只是想作爲輸出的最後一列,所以現在你可以使用一個foreach生成你想要的列:

final_data = foreach joined_data generate data2::collection; 

dump final_data; 
((1,2,3,4,5,6,7,8,9)) 
((9,8,7,6,5,4,3,2,1))