2017-02-16 69 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));