2017-02-16 50 views
1

我試圖通過數據庫(最終)作爲輸入。傳遞袋作爲輸入UDF在豬

dump final; 

給出: -

(4,john,john,David,Banking ,4,M,20-01-1994,78.65,345000,Arkansasdest1,Destination) 
(4,john,john,David,Banking ,4,M,20-01-1994,78.65,345000,Arkanssdest2,Destination) 
(4,johns,johns,David,Banking ,4,M,20-01-1994,78.65,345000,ArkansasSrc1,source) 
(4,johns,johns,David,Banking ,4,M,20-01-1994,78.65,345000,ArkansaSrc2,source) 

我要寫一個UDF用於處理上述databag和尋找源和目的地之間的不匹配,爲了做到這一點我必須檢查是否我的UDF是否接受數據包。所以我寫下面一個樣品UDF:

package PigUDFpck; 

import java.io.IOException; 
import java.util.Iterator; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.BagFactory; 
import org.apache.pig.data.DataBag; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.data.TupleFactory; 


public class databag extends EvalFunc<DataBag> { 
TupleFactory mTupleFactory = TupleFactory.getInstance(); 
BagFactory mBagFactory = BagFactory.getInstance(); 

public DataBag exec(Tuple input) throws IOException { // different return type 

    DataBag result = mBagFactory.newDefaultBag(); // change here 
    DataBag values = (DataBag)input.get(0); 
    for (Iterator<Tuple> iterator = values.iterator(); iterator.hasNext();) { 
     Tuple tuple = iterator.next(); 

     //logic 
     Tuple t = mTupleFactory.getInstance().newTuple(); 


     t.append(tuple); 

     result.add(t); 
    } 
    return result; // change here 
} 

} 

之後我註冊使用

REGISTER /usr/local/pig/UDF/UDFBAG.jar; 
DEFINE Databag Databag(); // not sure how to define it 

2017年2月16日19的路徑:07:05875 [主要] WARN org.apache.pig.newplan .BaseOperatorPlan - 遇到警告IMPLICIT_CAST_TO_INT 2次(s)。 //定義後得到這個警告。

final1 = FOREACH final GENERATE(Databag(final)); 

錯誤1200:豬腳本無法解析: 無效標投影:決賽:A柱需要從一個關係預計它被用作標

請大家幫我上定義UDF以及如何將DataBag傳遞給UDF

感謝

+0

您的代碼看起來不錯,不知道爲什麼你會得到警告和錯誤。你可以嘗試在for循環中做一個改變,而不是使用迭代器,使用'for(Tuple tuple:values){//你的代碼}'。另外爲什麼你要爲每一行創建新的元組? –

+0

嗨Rajen,你能告訴我如何定義UDF的格式。 – Vickyster

回答

1

嘗試

final1 = FOREACH final GENERATE(Databag(*)); 

儘管據我看,你的最終包含元組,而不是元組的包,所以你可能需要先按一些鍵對它進行分組。在這種情況下,它會像

final1 = FOREACH (group final [by key or all]) GENERATE(Databag(final));