1. 程式人生 > >hive正則表示式regexp_extract的第三個引數index

hive正則表示式regexp_extract的第三個引數index

表格的原始資料如下:

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來返回的