本文部分參考自:https://blog.csdn.net/qq_23897391/article/details/95303594
Hive第五天——Hive函數
自己的話:千里之行,始於足下。
每天都要保持前進,我勢必要有強勁的實力,再跟明天的自己問好。
URL解析函數
在工作中,我們除了JSON格式還會經常遇到URL格式的日誌數據,本文來詳細介紹在Hive中解析URL的函數:
1.parse_url
2.parse_url_tuple
一、URL簡介
在WWW網頁上,每一信息資源都有統一的且在網上唯一的地址,該地址就叫URL(Uniform Resource Locator,統一資源定位符),它是WWW的統一資源定位標誌,也就是網址。
下面我們編一個網址來介紹URL包含哪些可以解析的元素:
https://www.baidu.com/hzy?user_id=10000&platform=ios
protocol(協議):https,一種可以通過安全的 HTTPS 訪問該資源的傳輸協議,一般不需要解析。
hostname(主機名):www.baidu.com,一般不需要解析。
path(路徑):由零或多個“/”符號隔開的字符串,一般用來表示主機上的一個目錄或文件地址,這裏是/hzy ,一般不需要解析。
query(查詢):可選,用於給動態網頁傳遞參數,可有多個參數,用“&”符號隔開,每個參數的名和值用“=”符號隔開,這裏https://www.baidu.com/hzy?後的部分都屬於query,這個也是最常需要解析的部分,如下:
user_id=10000&platform=ios
二、解析URL單個元素的函數parse_url :
1.功能:
第一個參數urlString爲要解析的URL字符串;
第二個參數partToExtract爲要解析的選項,常見的有:PROTOCOL,HOST,PATH,QUERY四個,也就是上文提到的四個組成元素,注意,此參數必須大寫,最後返回解析對象的部分;
第三個參數只有partToExtract爲QUERY時才需要輸入,上文可知QUERY部分都是key=value的形式,所以這裏的keyToExtract就是輸入key的內容,最後返回value的值。
2.舉例:
解析協議:
hive > select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','PROTOCOL');
https
解析主機名:
hive > select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','HOST');
www.baidu.com
解析路徑:
hive > select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','PATH');
/hzy
解析QUERY:
hive > select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','QUERY');
user_id=10000&platform=ios
解析QUERY部分的value值:
hive > select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','QUERY','user_id');
10000
hive > select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','QUERY','platform');
ios
上面舉例中,只有最後一種是最常使用的場景。有時日誌的格式是QUERY部分的格式,但並不是一個URL,此時可以人爲的加上前面的協議、主機、路徑等部分,構造一個URL,然後使用parse_url函數解析日誌,如下:
日誌數據爲 user_id=10000&platform=ios
直接使用parse_url函數會返回NULL:
hive (app)> select parse_url('user_id=10000&platform=ios','QUERY');
NULL
使用concat函數構造URL格式,然後使用parse_url解析:
hive > select parse_url(concat('https://www.baidu.com/?','user_id=10000&platform=ios'),'QUERY','user_id');
10000
hive > select parse_url(concat('https://www.baidu.com/?','user_id=10000&platform=ios'),'QUERY','platform');
ios
注意:構造的URL中path後必須跟?,否則會返回NULL
三、同時解析URL多個元素的函數parse_url_tuple:
parse_url_tuple的用法類似上篇博客介紹的json_tuple,都是表生成函數。
parse_url_tuple(string urlStr,string p1,…,string pn)
1.功能:
第一個參數urlStr傳入URL字符串,後面依次輸入要解析的元素:PROTOCOL,HOST,PATH,QUERY等,返回解析所有內容。
2.舉例:
新建表src_url,將https://www.baidu.com/hzy?user_id=10000&platform=ios導入表中。
create table src_url(url string);
load data local inpath '/root/test.txt' into table src_url;
如果想同時解析所有的內容,需要使用5次parse_url,如下:
hive > SELECT parse_url(url, 'HOST') host ,
>parse_url(url, 'PATH') path,
>parse_url(url, 'QUERY') query,
>parse_url(url, 'QUERY', 'user_id') user_id,
>parse_url(url, 'QUERY', 'platform') platform
>FROM src_url;
host path query user_id platform
www.baidu.com /hzy user_id=10000&platform=ios 10000 ios
而生成同樣的數據,使用parse_url_tuple只需要一次,如下:
hive >SELECT b.*
>FROM src_url
>LATERAL VIEW parse_url_tuple(url, 'HOST', 'PATH', 'QUERY', 'QUERY:user_id', 'QUERY:platform') b
>as host, path, query, user_id ,platform;
b.host b.path b.query b.user_id b.platform
www.baidu.com /hzy user_id=10000&platform=ios 10000 ios
例如有網址:http://www.baidu.com/find?cookieid=4234234234
解析成:www.baidu.com /find cookieid 4234234234
hive> select parse_url_tuple("http://www.baidu.com/find?cookieid=4234234234",'HOST','PATH','QUERY','QUERY:cookieid')
from dual; #dual是一個空表,只有一個id字段