0

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

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

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

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

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

4

1 回答 1

2

最后,我实现了一个自定义 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);
         }
    }
}
于 2013-09-20T09:59:31.567 回答