2014-11-25 2 views
0

Я хочу создать пользовательскую функцию Load для Свиньи UDF, я создал SimpleTextLoader используя ссылкуSimpleTextLoader UDF в Pig

https://pig.apache.org/docs/r0.11.0/udf.html, я успешно создать файл фляги для этого кода, зарегистрироваться в свинью и запустить Pig Script. Я получаю пустой вывод. Я не знаю, как решить эту проблему, любая помощь будет оценена по достоинству.

Ниже мой Java-код

public class SimpleTextLoader extends LoadFunc{ 
    protected RecordReader in = null; 
    private byte fieldDel = '\t'; 
    private ArrayList<Object> mProtoTuple = null; 
    private TupleFactory mTupleFactory = TupleFactory.getInstance(); 
    private static final int BUFFER_SIZE = 1024; 
     public SimpleTextLoader() { 
    } 

public SimpleTextLoader(String delimiter) 
{ 
     this(); 
     if (delimiter.length() == 1) { 
      this.fieldDel = (byte)delimiter.charAt(0); 
     } else if (delimiter.length() > 1 && delimiter.charAt(0) == '\\') { 
      switch (delimiter.charAt(1)) { 
      case 't': 
       this.fieldDel = (byte)'\t'; 
       break; 

      case 'x': 
       fieldDel = 
        Integer.valueOf(delimiter.substring(2), 16).byteValue(); 
       break; 

      case 'u': 
       this.fieldDel = 
        Integer.valueOf(delimiter.substring(2)).byteValue(); 
       break; 

      default: 
       throw new RuntimeException("Unknown delimiter " + delimiter); 
      } 
     } else { 
      throw new RuntimeException("PigStorage delimeter must be a single character"); 
     } 
    } 

private void readField(byte[] buf, int start, int end) { 
     if (mProtoTuple == null) { 
      mProtoTuple = new ArrayList<Object>(); 
     } 

     if (start == end) { 
      // NULL value 
      mProtoTuple.add(null); 
     } else { 
      mProtoTuple.add(new DataByteArray(buf, start, end)); 
     } 
    } @Override 
    public Tuple getNext() throws IOException { 
     try { 
      boolean notDone = in.nextKeyValue(); 
      if (notDone) { 
       return null; 
      } 
      Text value = (Text) in.getCurrentValue(); 
      System.out.println("printing value" +value); 
      byte[] buf = value.getBytes(); 
      int len = value.getLength(); 
      int start = 0; 

      for (int i = 0; i < len; i++) { 
       if (buf[i] == fieldDel) { 
        readField(buf, start, i); 
        start = i + 1; 
       } 
      } 
      // pick up the last field 
      readField(buf, start, len); 

      Tuple t = mTupleFactory.newTupleNoCopy(mProtoTuple); 
      mProtoTuple = null; 
      System.out.println(t); 
      return t; 
     } catch (InterruptedException e) { 
      int errCode = 6018; 
      String errMsg = "Error while reading input"; 
      throw new ExecException(errMsg, errCode, 
        PigException.REMOTE_ENVIRONMENT, e); 
     } 

    } 


    @Override 
    public void setLocation(String string, Job job) throws IOException { 
     FileInputFormat.setInputPaths(job,string); 
    } 

    @Override 
    public InputFormat getInputFormat() throws IOException { 
     return new TextInputFormat(); 
    } 

    @Override 
    public void prepareToRead(RecordReader reader, PigSplit ps) throws IOException { 
     in=reader; 
    } 

} 

Ниже мой Pig Script

REGISTER /home/hadoop/netbeans/sampleloader/dist/sampleloader.jar 
a= load '/input.txt' using sampleloader.SimpleTextLoader(); 
store a into 'output'; 
+0

Вы получаете журналы ошибок? – MarHserus

+0

не получил никакого журнала ошибок, работа выполнена успешно, но создается пустой файл. – Mallieswari

ответ

1

Вы используете sampleloader.SimpleTextLoader(), что ничего не делает, поскольку это просто пустой конструктор.
Вместо этого используйте sampleloader.SimpleTextLoader(String delimiter), который выполняет фактическую операцию разделения.

+0

привет спасибо за ответ, я пробовал с разделителем тоже, я получаю пустой выход. – Mallieswari

+0

Пожалуйста, перейдите по этой ссылке для пошагового поиска данных с помощью функции загрузки пользовательской нагрузки [** здесь **] (http://shrikantbang.wordpress.com/2013/11/02/apache-pig-custom-load-function -2 /) –

Смежные вопросы