2012-10-31 170 views
6

我對PigScript比較新。我想知道是否有一種將參數傳遞給Pig中的Java UDF的方法?我可以將參數傳遞給Pig腳本中的UDF嗎?

這裏是場景: 我有一個日誌文件有不​​同的列(每個表示主鍵在另一個表)。我的任務是獲取所選列中不同主鍵值的計數。 我寫了一個Pig腳本,它可以完成獲取不同的主鍵並對它們進行計數的工作。 但是,我現在應該爲每列寫一個新的UDF。有一個更好的方法嗎?就像我可以將行號作爲參數傳遞給UDF一樣,它避免了我編寫多個UDF的需要。

exec(Tuple input) 

和訪問使用

input.get(index) 

回答

0

是的,你可以在你的UDF的元組參數輸入傳遞任何參數的UDF。所以這裏是一個客戶「分離器」的例子:

REGISTER com.sample.MyUDFs.jar; 
DEFINE CommaSplitter com.sample.MySplitter(','); 

B = FOREACH A GENERATE f1, CommaSplitter(f2); 

希望傳達這個想法。

+0

是的弗雷德。但是,我如何從PigScript方傳遞參數? – emkay

+0

我不知道這是不是你想要做的事情,但是你可以創建一個新的Tuple,主鍵作爲第一個字段,你實際想要傳遞給你的UDF的數據作爲剩餘的字段:'FOREACH tupleForUdf GENERATE primarykey,*;' – Frederic

3

的方式做到這一點是通過使用DEFINE和構造:

1

要通過你在你的pigscript以下參數:

UDF(document, '$param1', '$param2', '$param3') 

編輯:不知道如果這些PARAMS必須wrappedin '' 或不

,而在你的UDF你這樣做:

public class UDF extends EvalFunc<Boolean> { 



public Boolean exec(Tuple input) throws IOException { 

    if (input == null || input.size() == 0) 
     return false; 

    FileSystem fs = FileSystem.get(UDFContext.getUDFContext().getJobConf()); 


    String var1 = input.get(1).toString(); 
    InputStream var1In = fs.open(new Path(var1)); 


    String var2 = input.get(2).toString(); 
    InputStream var2In = fs.open(new Path(var2)); 

    String var3 = input.get(3).toString(); 
    InputStream var3In = fs.open(new Path(var3)); 



    return doyourthing(input.get(0).toString()); 
} 
} 

例如

相關問題