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