以下通用UDF可用於一字段轉換GBK字符集爲UTF-8。 在對此字段進行任何操作之前,應使用此UDF。
public class GUDFTestGBK extends GenericUDF{
private StringObjectInspector oi;
@Override
public ObjectInspector initialize(ObjectInspector [] arguments) throws UDFArgumentException {
if (arguments.length != 1) {
throw new UDFArgumentLengthException(
"The function GUDFTestGBK(s) takes exactly 1 arguments.");
}
converter = ObjectInspectorConverters.getConverter(arguments[0],
PrimitiveObjectInspectorFactory.writableStringObjectInspector);
oi = (StringObjectInspector)arguments[0];
return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
}
@Override
public Object evaluate(DeferredObject [] arguments) throws HiveException{
try{
Text str = oi.getPrimitiveWritableObject(arguments[0].get());
byte [] bytes = str.getBytes();
String s = new String(bytes, "GBK");
Text new_str = new Text(s.getBytes("UTF-8"));
return new_str;
} catch (Exception e){
return new Text("Charset conversion failed.");
}
}
@Override
public String getDisplayString(String[] children){
return "GBKToUTF8(" + children[0] + ")";
}
}
謝謝,我還沒有看到答覆。你有辦法匹配多行日誌信息嗎?或者我想用正則匹配做日誌異常棧處理,把它整體插入一個表字段中,然後輸入到文本中。你有什麼解決的方法麼?跪求,謝謝。 – user1099024 2012-07-19 02:49:38
你應該定義一個特殊的RecordReader負責將文件分割成記錄。默認的RecordReader使用'\ n'作爲記錄分隔符。所以如果你想處理錯誤堆棧,你必須實現一個更復雜的邏輯。 – 2012-10-16 01:43:11