Pig 中的 SimpleTextLoader UDF

Posted

技术标签:

【中文标题】Pig 中的 SimpleTextLoader UDF【英文标题】:SimpleTextLoader UDF in Pig 【发布时间】:2014-11-25 09:58:51 【问题描述】:

我想为 Pig UDF 创建一个自定义加载函数,我使用链接创建了一个 SimpleTextLoader

https://pig.apache.org/docs/r0.11.0/udf.html ,我已经成功生成了这段代码的 jar 文件,在 pig 中注册并运行 Pig 脚本。我得到的是空输出。我不知道如何解决这个问题,任何帮助将不胜感激。

下面是我的 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;
    


下面是我的猪脚本

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

【问题讨论】:

您是否收到任何错误日志? 没有得到任何错误日志,作业执行成功但创建了空文件。 【参考方案1】:

您正在使用 sampleloader.SimpleTextLoader(),它什么都不做,因为它只是一个空构造函数。 而是使用sampleloader.SimpleTextLoader(String delimiter),它正在执行拆分的实际操作。

【讨论】:

您好,感谢您的回复,我也尝试过使用分隔符,但输出为空。 使用猪自定义加载函数Here,请参考此链接逐步加载数据

以上是关于Pig 中的 SimpleTextLoader UDF的主要内容,如果未能解决你的问题,请参考以下文章

用于压缩和解压缩 bzip2 中的 hdfs 数据的 Pig 脚本

Pig ERROR 1075:从 UDF 接收到一个字节数组。无法确定如何将字节数组转换为字符串

Pig:使用外部模式文件加载数据文件

Pig - 如何一步加入和定义模式

Pig - 如何迭代一袋地图

使用 PIG 从 mysqldump 加载