hive正則表示式regexp_extract的第三個引數index
阿新 • • 發佈:2019-01-02
表格的原始資料如下:
a |
---|
152天內有67天無通話記錄 |
71天內有58天無通話記錄 |
154天內有8天無通話記錄 |
178天內有76天無通話記錄 |
NULL |
159天內有69天無通話記錄 |
手機關機時間從未超過1天 |
171天內有63天無通話記錄 |
163天內有90天無通話記錄 |
160天內有35天無通話記錄 |
現在想計算其中無通話記錄的天數的佔比,又不想在程式碼中使用中文(避免編碼問題),該怎麼做呢?
當然是正則表示式了!
hive的正則表示式函式是regexp_extract,具有三個引數:
regexp_extract(string subject, string pattern, int index)
前兩個都好理解,第三個是什麼意思呢?
不如試試看:
select
case
when regexp_extract(a,'([0-9]+)([^0-9]+)([0-9]+)',3)!=''
then regexp_extract(a,'([0-9]+)([^0-9]+)([0-9]+)',3)/regexp_extract(a,'([0-9]+)([^0-9]+)([0-9]+)',1)
when a is null then -9999990
else 0 end as rate,
regexp_extract(a,'([0-9]+)([^0-9]+)([0-9]+)' ,0),
regexp_extract(a,'([0-9]+)([^0-9]+)([0-9]+)',1),
regexp_extract(a,'([0-9]+)([^0-9]+)([0-9]+)',2),
regexp_extract(a,'([0-9]+)([^0-9]+)([0-9]+)',3),
a
from table
rate _c0 _c1 _c2 _c3 a 0.440789474 152天內有67 152 天內有 67 152天內有67天無通話記錄 0.816901408 71天內有58 71 天內有 58 71天內有58天無通話記錄 0.051948052 154天內有8 154 天內有 8 154天內有8天無通話記錄 0.426966292 178天內有76 178 天內有 76 178天內有76天無通話記錄 -9999990 NULL NULL NULL NULL NULL 0.433962264 159天內有69 159 天內有 69 159天內有69天無通話記錄 0 手機關機時間從未超過1天 0.368421053 171天內有63 171 天內有 63 171天內有63天無通話記錄 0.552147239 163天內有90 163 天內有 90 163天內有90天無通話記錄 0.21875 160天內有35 160 天內有 35 160天內有35天無通話記錄
可以看到,第三個引數index就是返回第幾個括號裡的值,而當index=0則是返回整個字串,也就是說,第一個括號裡的字串是沒法通過指定index來返回的