Pig base 64 编码/每条记录存储单行/删除换行符

Posted

技术标签:

【中文标题】Pig base 64 编码/每条记录存储单行/删除换行符【英文标题】:Pig base 64 encoding/ store single line per record / remove newlines 【发布时间】:2013-09-19 18:05:32 【问题描述】:

我正在尝试每行存储一些猪元组数据,以便稍后由外部系统处理。

我的一个字段是一个字节数组,代表一个结构不太好的 html,包含换行符。

我尝试使用REPLACE($0.raw,'(\r\n|\n|\t)','')),但无济于事,因为它需要 chararray 并在我尝试强制转换时返回错误。

压缩元组,只要它保证单行,就可以解决我的问题。

是否有一种简单的方法可以确保将记录存储在一行中(编写自定义 UDF 除外,尽管现有的 UDF 会很完美)?

【问题讨论】:

【参考方案1】:

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

UDF 定义:

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);
         
    

【讨论】:

以上是关于Pig base 64 编码/每条记录存储单行/删除换行符的主要内容,如果未能解决你的问题,请参考以下文章

Base64编码知识记录

为什么要用base64编码

SQL Server 2005 T-SQL中的Base64编码

将 base64 编码图像保存到 Firebase 存储

Base64 编码知识,一文打尽!

Base64编码原理分析