pig base 64编码/每记录存储一行/删除换行

f5emj3cl  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(369)

我正在尝试存储一些pig元组数据,每行一个,稍后由外部系统处理。
我的一个字段是bytearray,它表示一个结构不太好的html,包含换行符。
我试过用 REPLACE($0.raw,'(\r\n|\n|\t)','')) ,没有用,因为它需要chararray并在我尝试强制转换它时返回错误。
压缩元组,只要它能保证一行,就能解决我的问题。
有没有一种简单的方法来确保记录存储在一行中(除了编写自定义自定义自定义项,尽管已经存在的自定义项是完美的)?

2izufjch

2izufjch1#

最后,我实现了一个自定义udf,将bytearray转换为base64,然后通过standard将其应用于罪犯字段 res = FOREACH parsed GENERATE my.little.pony.udf.package.ByteArrayToByteArrayB64($0.raw); 自定义项定义:

package my.little.pony.udf.package;
import java.io.IOException;
import javax.xml.bind.DatatypeConverter;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.DataByteArray;

public class ByteArrayToByteArrayB64 extends EvalFunc<DataByteArray> {
    public DataByteArray exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0)
        return null;
        try{
            if (input.size() < 1){
                throw new IOException("Input is of size:"+input.size());
            }       

            DataByteArray data = (DataByteArray)input.get(0);
            String convertedBase64 = DatatypeConverter.printBase64Binary(data.get()); 
            return new DataByteArray(convertedBase64.getBytes("UTF-8"));

        }catch (ClassCastException e){
             throw new IOException("Tuple element at is really of type:"+input.get(0).getClass().getName());
        }catch(Exception e){
             throw new IOException("Caught exception processing input row ", e);
         }
    }
}

相关问题