hive 從url中提取需要的部分字串

2021-08-26 12:21:11 字數 2348 閱讀 1076

事情是這樣的,hive的a表中,有url這樣的乙個字段,我想要提取這個欄位中的某一部分(這不就是擷取字串嘛)。但是substring肯定是滿足不了我的需求的,自己寫hive的udf也不太現實(用最簡單的方式完成任務,才會讓後來的維護變得更加方便,否則除了維護sql還要維護一堆udf,那才叫可怕)。因此我初步的想法就是正則!然後經過同事的提醒,我知道了hive有自帶函式可以處理url,所以我來總結下三種方案! 

url格式是這樣的(我想要獲取group_id=後面的數字): 

/wenzhang/v1/***/?fold=1&offset=0&group_id=6594293942836003076&tab_index=0&count=20&(後面還有一大堆雜七雜八的東西)
方法一:通過正則獲得字串(hive處理正則的函式regexp_extract)

先說一句hive自帶函式的官方**:

正則中有個叫零寬斷言的東西,大概說的就是取某個字串的前面的字元,或者取後面的字元

題外話:

有個我覺得不錯的學習歸納正則**:

然後大家可以去這個頁面上試試正則:

有一點提醒下大家,每個框架(不同開發語言,不同資料庫)支援的正則並不是完全一樣的,所以測試非常重要,不要拿了別人寫的東西就直接用,有很大機率是不成功的!

言歸正傳:

所以我寫出的正則規則是這樣:(?<=group_id=)\d

意思就是匹配group_id=這串字串後面的1到無窮多個數字(實際測試可行)

那麼hive中,應該如何來寫這個正則呢?

其實又有點不一樣,如下圖:

select split(regexp_extract(split(url,'/')[4],'group_id=([0-9]+)',0),'=')[1] from 資料庫.表a  limit 1;

hive官網關於如何新增自定義函式:

1、新增臨時函式,只有當前hive的連線有效(當然對於以後一直需要使用的自定義函式,使用這個明顯不合理)

2、新增非臨時函式(做法其實是將函式打成jar包,上傳到hdfs,讓每個hive客戶端連線的時候,載入這個jar包,但是大家不覺得多維護乙個jar包是一件很麻煩的事情嗎?)

方法三:使用hive自帶的解析url的函式(parse_url)

說實話,這也是一搜一大把的函式

並且官方也寫了例子出來,挺簡單的。但是這個函式還是有要求的,他要求url必須工整。

例如:我的表中的url格式如下

/wenzhang/v1/***/?fold=1&offset=0&group_id=6594293942836003076&tab_index=0&count=20&(後面還有一大堆雜七雜八的東西)

也就是說他沒有http://這個頭,對不起,這個函式解析不了,因此就必須把每個url加上乙個http頭!

注意:不同資料庫的字串拼接會有些許差異,有的直接用"+",有的用"||"(greenplum),hive中使用"concat"這個函式

因此有缺陷的sql如下:

--第二個位置上的引數可以傳入:host, path, query, ref, protocol, authority, file, and userinfo來獲取url的不同部分 

select parse_url(concat('http://',url), 'query','group_id') from 資料庫.表a

一定要特別注意:因為如果資料原來有https://的頭,然後你強行加了http://頭,這樣url_host解析出來就是https!!所以正確的sql如下:

--第二個位置上的引數可以傳入:host, path, query, ref, protocol, authority, file, and userinfo來獲取url的不同部分 

select parse_url(case when url like 'http://%' or url like 'https://%' then url else concat('http://',url) end,'host') as url_host from 資料庫.表a

從Wireshark監聽的資料中提取需要的資料

最近,需要將wireshark監聽的資料進行提取,分兩步 首先,應該得出wireshark的資料報吧,在圖形化介面中可以非常直觀的將監聽資料進行儲存,但是這樣需要手動操作非常麻煩,而且容易出錯 隨著處理資料報的數量增加,圖形化可能吃不消,以前就遇見過 在linux下,採用了tshark命令,tsha...

從Wireshark監聽的資料中提取需要的資料

最近,需要將wireshark監聽的資料進行提取,分兩步 首先,應該得出wireshark的資料報吧,在圖形化介面中可以非常直觀的將監聽資料進行儲存,但是這樣需要手動操作非常麻煩,而且容易出錯 隨著處理資料報的數量增加,圖形化可能吃不消,以前就遇見過 在linux下,採用了tshark命令,tsha...

Python實現從url中提取網域名稱的幾種方法

這篇文章主要介紹了python實現從url中提取網域名稱的幾種方法,本文給出了3種方法實現在url中提取網域名稱的需求,需要的朋友可以參考下。從url中找到網域名稱,首先想到的是用正則,然後尋找相應的類庫。用正則解析有很多不完備的地方,url中有網域名稱,網域名稱字尾一直在不斷增加等。通過googl...