2015-09-07 74 views
0

下面的代碼工作得很好,但是當我已經有兩個現有的袋(與他們的別名,假設S1和S2用於表示兩套兩個現有的袋),不知道如何調用UDF setDifference產生設置差異?我認爲如果我手動構建一個額外的包,使用我現有的輸入袋(S1和S2),這將是額外的開銷?Hadoop的豬UDF調用的問題,

register datafu-1.2.0.jar; 
define setDifference datafu.pig.sets.SetDifference(); 

-- ({(3),(4),(1),(2),(7),(5),(6)} \t {(1),(3),(5),(12)}) 
A = load 'input.txt' AS (B1:bag{T:tuple(val:int)},B2:bag{T:tuple(val:int)}); 

F1 = foreach A generate B1; 
F2 = foreach A generate B2; 

differenced = FOREACH A { 
    -- input bags must be sorted 
    sorted_b1 = ORDER B1 by val; 
    sorted_b2 = ORDER B2 by val; 
    GENERATE setDifference(sorted_b1,sorted_b2); 
} 

-- produces: ({(2),(4),(6),(7)}) 
DUMP differenced; 

更新:

的問題是,假設我有兩個包已經,如何調用UDF setDifference得到一套區別在哪裏?我是否需要製造另一個包含兩個獨立包的超級包?謝謝。

在此先感謝, 林

回答

1

我看不出與UDF調用任何開銷問題。

價:http://datafu.incubator.apache.org/docs/datafu/guide/set-operations.html,我們已就使用SetDifference方法的例子。

按照API(http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/sets/SetDifference.html)SetDifference方法接受袋作爲輸入併發射它們之間的區別。

N.B.請注意,輸入袋必須進行分類。

在的示例代碼片段共享,我沒有看到該響應的需要下面的代碼片段

F1 = foreach A generate B1; 
F2 = foreach A generate B2; 
+0

感謝的,你的意思是與F1和F2調用setDifference作爲輸入參數?謝謝。 –

+0

@ LinMa:在上面的代碼片段中,我沒有看到別名F1和F2的需要。參考。第一個鏈接共享我們有一個使用SetDifference方法的例子。 –

+0

對不起,我可能不清楚我的問題。我的意思是如果我已經有兩個包,如何調用UDF setDifference?在代碼示例中,它似乎假定從具有兩個包的文件讀取。 –