2015-09-29 44 views
1

我想創建一個蜂巢外部表,使用org.apache.hadoop.hive.serde2.RegexSerDe來分析一些Log4J日誌。蜂巢正則表達式不工作

但是我的regex即使在http://www.regexr.com/的測試中沒有問題也無法正常工作。

我的問題是當我有多行日誌,例如,與它相應的StackTrace的異常日誌。

下面是一個例子:

@@@@ 2015-09-29T11:20:45,549 INFO MYHOSTNAME my-app org.hibernate.jpa.internal.util.LogHelper HHH000204: Processing PersistenceUnitInfo [ 
    name: name 
    ...] @@@@ 

我已經添加了對日誌的開始和結束的模式,以幫助其解壓縮時出現多線。

這是我的正則表達式:

@@@@ (.{23}) ([\\w]+) ([\\w]+) ([\\w\\-]+) ([\\w\\.$]+) ([\\s\\S]+) @@@@ 

這是我的表:

CREATE EXTERNAL TABLE log4j(
    dt STRING, 
    level STRING, 
    host STRING, 
    app_name STRING, 
    clazz STRING, 
    message STRING) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ("input.regex" = "@@@@ (.{23}) ([\\w]+) ([\\w]+) ([\\w\\-]+) ([\\w\\.$]+) ([\\s\\S]+) @@@@") 
STORED AS TEXTFILE 
LOCATION 'hdfs://localhost:9000/logs/'; 

使用單線記錄它工作正常,但像例子中的一個多線,提取數所有列爲空的行。

+0

你能嘗試添加''(S?)正則表達式?像這裏https://regex101.com/r/qF0rD1/1 –

+0

沒有工作,同樣的問題發生。 – ffleandro

回答

0

如果使用:

STORED AS TEXTFILE 

然後Hadoop的將第一分手由線(\r\n\r\n)的輸入端,和第二飼料每個輸入行到RegexSerDe。這就是爲什麼您無法使用TEXTFILE將多行輸入轉換爲單行輸出的原因。相反,嘗試使用:

STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 

和設置Hadoop的配置屬性textinputformat.record.delimiter到任何串在你輸入兩個記錄分開。對於您的數據,一個示例分隔符可能是@@@@\[email protected]@@@@@@@\r\[email protected]@@@。請記住,設置此分隔符會從數據中刪除匹配的文本,因此您處理的記錄中不會有@@@@。更改任何配置文件之前測試了這一點

一種方法是運行查詢之前,將其設置在蜂巢shell會話:在開始時

set [email protected]@@@\[email protected]@@@