2013-07-08 21 views
4

我正在使用下面的正則表達式(選項卡分離)來解析數據(也是選項卡分離)給出。執行錯誤:從org.apache.hadoop.hive.ql.exec.DDLTask

蜂巢創建表的語法:

create table akmlogreg(logdate string, time string, clientip string, method string, uri string, status string, bytes string, TimeTakenMS string, referer string, useragent string, cs_Cookie string) ROW FORMAT SERDE 
'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
"input.regex" ="([0-9-]+) ([^\t]*) ([^\t]*) ([^\t]*) ([^\t]*) ([^\t]*) ([^\t]*) ([^\t]*) (\".*\"|[^ ]*) (\".*\"|[^ ]*) ([^\r\n]+)", 
"output.format.string"="%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s %10$s %11$s"); 

通過這個表達式,我想任何意見(#開頭的行)應該被刪除,每次只能選擇一個列。 但是,當我嘗試在配置單元中創建表時,此語法給出錯誤。我在tab分隔正則表達式背後的邏輯是我的日誌數據也是製表符分隔的。 任何人都可以給我一個更好的建議或解決方案,我可以解析這種數據,這是使用正則表達式分離標籤?

例外:

FAILED: Error in metadata: java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 10 
([0-9-]+)]+) 
     ^
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask 

數據:

#Version: 1.0 
#Fields: date time cs-ip cs-method cs-uri sc-status sc-bytes time-taken cs(Referer) cs(User-Agent) cs(Cookie) 
2013-07-02 00:00:00 242.242.242.242 GET /9699/14916.jpg 200 6783 0 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.23 Safari/534.10" "-" 
2013-07-02 00:00:00 242.242.242.242 GET /169875/2006-2010-679336-640x428.JPG 200 78221 355 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36" "-" 
2013-07-02 00:00:00 242.242.242.242 GET /169875/2006-2010-679339-640x428.JPG 200 86791 238 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36" "-" 

回答

3

試試這個:

^([0-9-]+)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t(\".*?\"|[^ ]*)\t(\".*?\"|[^ ]*)\t([^\r\n]+)$ 

Regular expression image

+1

感謝亞歷克斯。有效。順便說一下,你有什麼想法爲什麼配置單元不採取選項卡分離正則表達式? – Naresh

+1

我不能說蜂巢...但作爲一般的經驗法則,當編寫正則表達式時,我總是明確指定我想匹配的字符;不管正在使用的正則表達式風味。 – Stephan