暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[Hive系列04] URL解析函数

数据分析师的FIRE人生 2021-06-06
1607

点击上方「数据分析师的FIRE人生」→

点击右上角「...」→设为星标


大家好,我是风影楼,一名互联网公司的数据分析师。之前我曾在CSDN编写了Hive系列的付费博客专栏,目前收获了25W次的访问,不过由于CSDN的付费设置无法取消,所以我决定在公众号重新免费分享一遍。这一篇主要介绍Hive中的URL解析函数。

1.什么是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

2. 解析URL单个元素的函数:parse_url

parse_url(string urlString, string partToExtract [, string keyToExtract])


功能:

第一个参数urlString为要解析的URL字符串;


第二个参数partToExtract为要解析的选项,常见的有:PROTOCOL,HOST,PATH,QUERY四个,也就是上文提到的四个组成元素,注意,此参数必须大写,最后返回解析对象的部分;


第三个参数只有partToExtract为QUERY时才需要输入,上文可知QUERY部分都是key=value的形式,所以这里的keyToExtract就是输入key的内容,最后返回value的值。


举例 :

    解析协议:
    hive (app)> select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','PROTOCOL');
    https


    解析主机名:
    hive (app)> select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','HOST');
    www.baidu.com


    解析路径:
    hive (app)> select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','PATH');
    /hzy


    解析QUERY:
    hive (app)> select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','QUERY');
    user_id=10000&platform=ios


    解析QUERY部分的value值:
    hive (app)> select parse_url('https://www.baidu.com/hzy?user_id=10000&platform=ios','QUERY','user_id');
    10000


    hive (app)> 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 (app)> select parse_url(concat('https://www.baidu.com/?','user_id=10000&platform=ios'),'QUERY','user_id');


      10000


      hive (app)> select parse_url(concat('https://www.baidu.com/?','user_id=10000&platform=ios'),'QUERY','platform');


      ios

      注意:构造的URL中path后必须跟?,否则会返回NULL

        hive (app)> select parse_url(concat('https://www.baidu.com/','user_id=10000&platform=ios'),'QUERY','platform');


        NULL

        3. 同时解析URL多个元素的函数:parse_url_tuple

        parse_url_tuple的用法类似上篇博客介绍的json_tuple,都是表生成函数。


        parse_url_tuple(string urlStr,string p1,...,string pn)


        功能:

        第一个参数urlStr传入URL字符串,后面依次输入要解析的元素:PROTOCOL,HOST,PATH,QUERY等,返回解析所有内容。


        举例:

        新建表src_url,将https://www.baidu.com/hzy?user_id=10000&platform=ios导入表中。如果想同时解析所有的内容,需要使用5次parse_url,如下:

          hive (app)> 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 (app)> 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

            文章转载自数据分析师的FIRE人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论