hive中的正則表達式


這幾天,忙着做一些測試。昨天剛剛做了一個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轉義,只有正則轉義時,只匹配中間的部分):
正確的方法:







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM