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

Hive URL解析函数详解及实际应用

会飞的一十六 2024-09-04
4



01



业务场景




业务需求中,我们经常需要对用户的访问、用户的来源进行分析,用于支持运营和决策。例如我们经常对用户访问的页面进行统计分析,分析热门受访页面的Top10,观察大部分用户最喜欢的访问最多的页面等:


又或者我们需要分析不同搜索平台的用户来源分析,统计不同搜索平台中进入网站的用户个数,根据数据进行精准的引导和精准的广告投放等:


要想实现上面的受访分析、来源分析等业务,必须在实际处理数据的过程中,对用户访问的URL和用户的来源URL进行解析处理,获取用户的访问域名、访问页面、用户数据参数、来源域名、来源路径等信息。


02


URL基本组成

(1)URL基本组成

在对URL进行解析时,我们要先了解URL的基本组成部分,再根据实际的需求从URL中获取对应的部分,例如一条URL由以下几个部分组成:


(2) PROTOCOL 协议

通信协议类型,一般也叫作Schema,常见的有http、https等;


    HOST:域名




    一般为服务器的域名主机名或ip地址




    PATH:访问路径




    访问路径目录,由“/”隔开的字符串,表示的是主机上的目录或文件地址




    QUERY:参数数据




    查询参数,此项为可选项,可以给动态网页传递参数,用“&”隔开,每个参数的名和值用“=”隔开


    03


    Hive URL解析函数

    3.1  数据准备

    Hive中为了实现对URL的解析,专门提供了解析URL的函数parse_urlparse_url_tuple,在show functions中可以看到对应函数



    为了更好的学习这两个函数的使用,下面我们在Hive中创建一张表,加载url数据来进行测试。

    准备数据

      1    http://facebook.com/path/p1.php?query=1
      2 http://tongji.baidu.com/news/index.jsp?uuid=frank
      3 http://www.jdwz.com/index?source=baidu
      4    http://www.itcast.cn/index?source=alibaba

      创建数据库


        /*创建数据库*/
        create database if not exists db_function;
        /*切换数据库*/
        use db_function;



        创建表



          /*创建数据表*/
          create table tb_url(
          id int,
          url string
          ) row format delimited fields terminated by '\t';



          加载数据



            /*加载数据*/
            load data local inpath '/export/data/url.txt' into table tb_url;



            查看数据



              /*查询数据*/
              select * from tb_url;




              3.3 需求

              基于当前的数据,实现对URL进行分析,从URL中获取每个ID对应HOST、PATH以及QUERY,最终实现效果如下:


              3.3.1 parse_url 讲解


              (1)功能


              parse_url函数是Hive中提供的最基本的url解析函数,可以根据指定的参数,从URL解析出对应的参数值进行返回,函数为普通的一对一函数类型。


              (2)语法


                parse_url(url, partToExtract[, key]) - extracts a part from a URL
                Parts: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO key


                parse_url在使用时需要指定两个参数


                • 第一个参数:url:指定要解析的URL

                • 第二个参数:key:指定要解析的内容

                示例

                  SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'HOST') FROM src LIMIT 1;
                  'facebook.com'
                   
                  SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'QUERY') FROM src LIMIT 1;
                  'query=1'


                  SELECT parse_url('http://facebook.com/path/p1.php?query=1', 'QUERY', 'query') FROM src LIMIT 1;
                  '1'


                  3.3.2 测试


                  查询tb_url中每个url的HOST


                    select id,url,parse_url(url,"HOST") as host from tb_url;

                    查询tb_url中每个url的PATH


                      select id,url,parse_url(url,"PATH") as path from tb_url;

                      查询tb_url中每个url的QUERY


                        select id,url,parse_url(url,"QUERY") as query from tb_url;


                        3.3.3 实现需求

                          select
                          id,
                          parse_url(url,"HOST") as host,
                          parse_url(url,"PATH") as path,
                          parse_url(url,"QUERY") as query
                          from
                          tb_url;




                          3.3.4 注意问题


                          使用parse_url函数每次只能解析一个参数,导致需要经过多个函数调用才能构建多列,开发角度较为麻烦,实现过程性能也相对较差,需要对同一列做多次计算处理,我们希望能实现调用一次函数,就可以将多个参数进行解析,得到多列结果。


                          3.5 parse_url_tuple


                          功能

                          parse_url_tuple函数是Hive中提供的基于parse_url的url解析函数,可以通过一次指定多个参数,从URL解析出多个参数的值进行返回多列,函数为特殊的一对多函数类型,即通常所说的UDTF函数类型。


                          语法

                            parse_url_tuple(url, partname1, partname2, ..., partnameN) - extracts N (N>=1) parts from a URL.
                            It takes a URL and one or multiple partnames, and returns a tuple. All the input parameters and output column types are string.
                            Partname: HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE, USERINFO, QUERY:<KEY_NAME>


                            parse_url在使用时可以指定多个参数


                            第一个参数:url:指定要解析的URL


                            第二个参数:key1:指定要解析的内容1


                            ……


                            第N个参数:keyN:指定要解析的内容N


                            示例


                              SELECT b.* FROM src LATERAL VIEW parse_url_tuple(fullurl, 'HOST', 'PATH', 'QUERY', 'QUERY:id') b as host, path, query, query_id LIMIT 1;




                                SELECT parse_url_tuple(a.fullurl, 'HOST', 'PATH', 'QUERY', 'REF', 'PROTOCOL', 'FILE',  'AUTHORITY', 'USERINFO', 'QUERY:k1') as (ho, pa, qu, re, pr, fi, au, us, qk1) from src a;


                                测试


                                  查询tb_url中每个url的HOST、PATH
                                  select parse_url_tuple(url,"HOST","PATH") as (host,path) from tb_url;

                                   


                                  3.5.1 需求

                                  查询tb_url中每个url的PROTOCOL、HOST、QUERY


                                    select parse_url_tuple(url,"PROTOCOL","HOST","PATH") as (protocol,host,path) from tb_url;




                                    3.5.2 实现需求


                                    select parse_url_tuple(url,"HOST","PATH","QUERY") as (host,path,queryfrom tb_url;



                                    3.5.3 注意问题

                                    当前实现的过程中,通过parse_url_tuple实现了通过调用一个函数,就可以从URL中解析得到多个参数的值,但是当我们将原表的字段放在一起查询时,会出现以下问题:

                                      select


                                      id,


                                      parse_url_tuple(url,"HOST","PATH","QUERY") as (host,path,query)


                                      from tb_url;


                                      0: jdbc:hive2://node1:10000> select


                                      . . . . . . . . . . . . . .> id,


                                      . . . . . . . . . . . . . .> parse_url_tuple(url,"HOST","PATH","QUERY") as (host,path,query)


                                      . . . . . . . . . . . . . .> from tb_url;


                                      Error: Error while compiling statement: FAILED: SemanticException 3:52 AS clause has an invalid number of aliases. Error encountered near token 'path' (state=42000,code=40000)




                                      04


                                      小结

                                      本文根据实际业务中存在问题,对hive中url解析函数进行了详细分析,给出了具体的应用示例,并针对每种函数存在的问题进行分析,给出相应的解决方案。





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

                                      评论