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 编码/每条记录存储单行/删除换行符的主要内容,如果未能解决你的问题,请参考以下文章