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字段

在这里插入图片描述

你可能感兴趣的:(Hive基础,jasmine,hive第五天)