這幾天,忙着做一些測試。昨天剛剛做了一個hive的小測試,但是hive中的正則表達式寫法讓我痛苦不已,這里記錄下問題和一些想法。
背景:
前幾天拿來apache日志,用hive的正則進行匹配,發現匹配出來的字段算是NULL,但是我用RegexBuddy工具顯示能夠匹配的到啊!例子如下(我拿正常的apache日志來比較,我的apache日志格式被更改過)
1、apache日志格式:
2、正則表達式:
3.工具匹配后結果:
4.把正則拿到hive里面做create table操作,結果匹配出的全是null,之后查閱了資料吧正則寫成如下格式就可以匹配了(多了轉義符號):
主要原因有兩個之后會詳細講解。
原因:
1、首先理解下轉義字符,就是把具有特殊意義的字符例如?或[等。編程"單純"的字符串,例如"\?"就表示'?'本身。
2、但是在方括號里面情況有點復雜:
如果你想匹配*?+這樣的字符,第一點想到的是[\*\?\+];
首先要理解的是,在hive中‘\’本身就代表轉義字符,這與原有正則里面的轉義,也有點不同,意思是:要經過兩次轉義后(hive
和正則)才會匹配,我們在背景里面單一的做了正則的轉義,而沒有做hive的轉義(這里面有點混亂,需要讀者自己理清楚),但是在再加上一個轉義符號后,就變得正常。我們的例子來說正常的hive寫法應該為[\\*\\?\\+]。
這里只是基本的一些想法,也是看了別人的文章總結的:
Oracle,green plum,hive中正則表達式的元字符轉義比較雜談
在處理后正則語法就算成功,但是還是匹配不到字段,我用了最簡單的正則也不能夠匹配字符串里面的字段,后來做個測試,原因如下:
hive的正則表達式只支持全匹配,意思是:當讀入一行日志做正則匹配時,必須從這一行的開始進行匹配到這一行的結束,不能夠從中間進行匹配,就算只要中間的字段,也要用‘.’吸收掉前的或后面的”全部“字符。
錯誤的匹配方法(沒有考慮hive轉義,只有正則轉義時,只匹配中間的部分):

正確的方法:
