Pig UDF java ไม่อยู่ในดัชนี

ฉันมีปัญหาในการเข้าถึง pig ด้วย UDF ของฉัน ฉันได้ทำการจัดกลุ่ม "จัดกลุ่มตาม" ที่ได้รับผลลัพธ์ซึ่งก็คือ (Andi, 19495) และอธิบายโดย pig เป็น C: {group: chararray, long} ตอนนี้ฉันต้องการจัดรูปแบบเอาต์พุตเป็น (Andi 19495) เป็นสตริง แต่ UDF ของฉันรายงาน
ต่อไปนี้

"Caught error from UDF: pigUDF.Output, Out of bounds access [Index: 1, Size: 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;        
   }    
}

person Andi Maier    schedule 17.03.2016    source แหล่งที่มา
comment
คุณสามารถโพสต์ Pig Script ของคุณได้ไหม คุณอาจใช้ CONCAT เพื่อจัดรูปแบบเอาต์พุตของคุณแทน UDF   -  person VK_217    schedule 18.03.2016


คำตอบ (2)


แทนที่จะเขียน UDF คุณสามารถใช้ CONCAT และบรรลุเป้าหมายเดียวกัน ผลลัพธ์.

CONCAT กลุ่มที่มีนิพจน์ผลลัพธ์เป็น ' ' และ SUM(A) นอกจากนี้ เนื่องจาก CONCAT คาดหวังนิพจน์ประเภทเดียวกัน คุณจะต้องแปลงค่า int SUM(A) ไปยัง chararray ลองเปลี่ยนดู

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

To

C = FOREACH A GENERATE CONCAT(group,CONCAT(' ',(chararray)SUM(A)));
person VK_217    schedule 18.03.2016
comment
มาก. ขอบคุณสำหรับการอธิบาย - person Fund Monica's Lawsuit; 18.03.2016

คุณสามารถใช้วิธีอื่นเพื่อให้ได้ผลลัพธ์ที่คล้ายกันโดยไม่ต้องเรียกใช้ UDF แบบกำหนดเอง

อินพุต

อันดี,19495

สคริปต์

A = โหลด 'data.txt' โดยใช้ PigStorage (',') AS (ชื่อ: chararray, ค่า: ยาว);

B = FOREACH CONCAT ที่สร้าง (ชื่อ, CONCAT (' ', (chararray) ค่า));

การถ่ายโอนข้อมูล B;

เอาท์พุท

(แอนดี 19495)

หวังว่านี่จะช่วยได้ในตอนนี้ ฉันจะโพสต์โซลูชันที่ใช้ UDF ให้คุณในภายหลังด้วย

person CodeReaper    schedule 18.03.2016
comment
สวัสดี ฉันทำคำสั่งต่อไปนี้: C =FOREACH A GENERATE group, SUM(A); ผลลัพธ์จึงเป็นเช่นนั้น (Andi, 19495) ด้วย C: {group: chararray, long} - person Andi Maier; 18.03.2016
comment
ขอบคุณสำหรับวิธีแก้ปัญหา แต่วิธีแก้ปัญหาด้านล่างแก้ไขได้ - person Andi Maier; 18.03.2016