我正在尝试每行存储一些猪元组数据,以便稍后由外部系统处理。
我的一个字段是一个字节数组,代表一个结构不太好的 html,包含换行符。
我尝试使用REPLACE($0.raw,'(\r\n|\n|\t)',''))
, 无济于事,因为它需要 chararray 并在我尝试强制转换时返回错误。
压缩元组,只要它保证单行,就可以解决我的问题。
是否有一种简单的方法可以确保将记录存储在一行中(编写自定义 UDF 除外,尽管已经存在的 UDF 会很完美)?
我正在尝试每行存储一些猪元组数据,以便稍后由外部系统处理。
我的一个字段是一个字节数组,代表一个结构不太好的 html,包含换行符。
我尝试使用REPLACE($0.raw,'(\r\n|\n|\t)',''))
, 无济于事,因为它需要 chararray 并在我尝试强制转换时返回错误。
压缩元组,只要它保证单行,就可以解决我的问题。
是否有一种简单的方法可以确保将记录存储在一行中(编写自定义 UDF 除外,尽管已经存在的 UDF 会很完美)?
最后,我实现了一个自定义 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);
}
}
}