2017-06-13 66 views
1

在Apache Pig(版本0.16.x)中,通過某個數據集字段的現有值列表篩選數據集的最有效方法是什麼?Pig:通過加載列表進行高效篩選

例如,

輸入(每@ inquisitive_mind的尖端已更新):一個線分隔文件每行一個值 my_codes.txt

'110' 
'100' 
'000' 

sample_data.txt

'110', 2 
'110', 3 
'001', 3 
'000', 1 

所需輸出

'110', 2 
'110', 3 
'000', 1 

示例腳本

%default my_codes_file 'my_codes.txt' 
%default sample_data_file 'sample_data.txt' 
my_codes = LOAD '$my_codes_file' as (code:chararray) 
sample_data = LOAD '$sample_data_file' as (code: chararray, point: float) 
desired_data = FILTER sample_data BY code IN (my_codes.code); 

錯誤:

Scalar has more than one row in the output. 1st : ('110'), 2nd :('100') 
(common cause: "JOIN" then "FOREACH ... GENERATE foo.bar" should be "foo::bar") 

我還曾試圖FILTER sample_data BY code IN my_codes;但 「IN」 的條款似乎需要括號。 我也試過FILTER sample_data BY code IN (my_codes);但得到的錯誤: A柱需要從一個關係預計它被用作標

+0

後續:如果現有的列表中小與正在查詢的數據集相比,Pig中的* replicated * join比標準JOIN更有效。 – Quetzalcoatl

回答

1

的my_codes.txt文件具有代碼爲行而不是列。既然你是加載到一個單一領域的代碼應該是這樣的下面

'110' 
'100' 
'000' 

或者,你可以使用JOIN

joined_data = JOIN sample_date BY code,my_codes BY code; 
desired_data = FOREACH joined_data GENERATE $0,$1; 
+0

此外,似乎計算上有利於選擇過濾器加入,但在這種情況下它們可能同樣密集(例如,如果my_codex.txt包含10億條記錄)? – Quetzalcoatl

+0

是的,過濾器是有利的。我懷疑「IN」會起作用,因爲在早期版本的PIG中,您必須明確指定用逗號分隔的值並括在圓括號中。 –

+0

正確。即使有更新的版本,如果my_codes> 1000的值,「IN」看起來並不實際。因此,您的JOIN解決方案看起來最好 – Quetzalcoatl