2016-03-17 33 views
0

我在使用我的UDF时遇到了猪的访问问题。我已经做了一个分组“集团BY”收到一个输出是(安迪,19495),并描述猪为 C: {group: chararray, long}。 现在我想将输出格式化为(Andi 19495)作为字符串。但我的UDF报告以下
Pig UDF java出于索引

“从UDF陷入错误:pigUDF.Output,越界进入[指数:1,尺寸:1]”

我不明白为什么会这样。

这里是我的Java UDF:

package pigUDF; 
import java.io.IOException; 
import org.apache.pig.EvalFunc; 
import org.apache.pig.data.BagFactory; 
import org.apache.pig.data.DataType; 
import org.apache.pig.data.Tuple; 
import org.apache.pig.data.TupleFactory; 
import org.apache.pig.impl.logicalLayer.schema.Schema; 
import org.apache.pig.impl.logicalLayer.schema.Schema.FieldSchema; 

public class Output extends EvalFunc<Tuple>{ 
    TupleFactory tupleFactory = TupleFactory.getInstance(); 
    BagFactory mBagFactory = BagFactory.getInstance(); 

    private static Tuple nullValue=TupleFactory.getInstance().newTuple(2); 

    @Override 
    public Tuple exec(Tuple input) throws IOException { 

    if (input==null) return nullValue; 

    Tuple t= tupleFactory.newTuple(1); 

    String o = (String) input.get(0); 
    int o1 = (Integer) input.get(1); 


    String myString=o+" "+String.valueOf(o1); 
    System.out.println(myString); 

    t.set(0,myString); 

    return t;   
    } 

    @Override 
    public Schema outputSchema(Schema input){ 

    Schema tupleSchema = new Schema(); 
    tupleSchema.add(new FieldSchema("group", DataType.CHARARRAY));   
    Schema s = new Schema (new FieldSchema(null, tupleSchema)); 
    return s;   
    }  
} 
+0

你可以发布你的猪脚本你也许可以使用CONCAT格式化你的输出,而不是一个UDF –

回答

0

您可以使用另一种方法来得到类似的结果,而不调用自定义的UDF。

INPUT

岸堤,19495

SCRIPT

A = LOAD '的data.txt' USING PigStorage( '')AS(名称:chararray,值:长); B = FOREACH A GENERATE CONCAT(name,CONCAT('',(chararray)value));}};}}};

DUMP B;

输出

(安迪19495)

希望这有助于现在。稍后我会为您发布基于UDF的解决方案。

+0

嗨,我做了下面的命令:C = FOREACH一GENERATE组,SUM(A);输出结果是(Andi,19495)与C:{group:chararray,long}。 –

+0

它解决了你面临的问题吗? – CodeReaper

+0

感谢您的解决方案,但下面的解决方案解决了它 –

1

而不是写一个UDF你可以使用CONCAT并达到相同的结果。

CONCAT组的结果表达式为''和SUM(A)。因为CONCAT期望同一类型的表达式,所以您必须将int SUM(A)值转换为chararray。 ? 尝试改变

C = FOREACH A GENERATE group, SUM(A); 

C = FOREACH A GENERATE CONCAT(group,CONCAT(' ',(chararray)SUM(A))); 
+2

非常。感谢您的解释。 –

+0

谢谢,解决了我的问题 –