Hive第五天——Hive函數(URL解析函數)


本文部分參考自: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字段

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章