2012-01-06 93 views
0

我想在蜂巢定製inputformat使用,我發現這裏的代碼: https://github.com/msukmanowsky/OmnitureDataFileInputFormat 但是當我完成了測試代碼中,我發現,我想在蜂巢解析FTP日誌文件由「ANSI」(實際上是「GBK」)編碼,因此在java控制檯中不能正常顯示結果。如何ANSI轉換爲UTF8在蜂巢

所以,你可以幫助我如何將代碼轉換,以確保正常顯示,謝謝。 您可以在OmnitureDataFileInputFormat中創建一個示例。代碼在地址: https://github.com/msukmanowsky/OmnitureDataFileInputFormat

非常感謝!

回答

0

以下通用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] + ")"; 
} 
} 
+0

謝謝,我還沒有看到答覆。你有辦法匹配多行日誌信息嗎?或者我想用正則匹配做日誌異常棧處理,把它整體插入一個表字段中,然後輸入到文本中。你有什麼解決的方法麼?跪求,謝謝。 – user1099024 2012-07-19 02:49:38

+0

你應該定義一個特殊的RecordReader負責將文件分割成記錄。默認的RecordReader使用'\ n'作爲記錄分隔符。所以如果你想處理錯誤堆棧,你必須實現一個更復雜的邏輯。 – 2012-10-16 01:43:11