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
感謝
您的代碼看起來不錯,不知道爲什麼你會得到警告和錯誤。你可以嘗試在for循環中做一個改變,而不是使用迭代器,使用'for(Tuple tuple:values){//你的代碼}'。另外爲什麼你要爲每一行創建新的元組? –
嗨Rajen,你能告訴我如何定義UDF的格式。 – Vickyster