大数据Hive URL解析函数及侧视图

本文涉及的产品
.cn 域名,1个 12个月
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介: 大数据Hive URL解析函数及侧视图

1 实际工作需求

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


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

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

2 URL的基本组成

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

➢ PROTOCOL:协议类型

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

➢ HOST:域名

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

➢ PATH:访问路径

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

➢ QUERY:参数数据

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

3 Hive中的URL解析函数

3.1 数据准备

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

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

➢ 准备数据

vim /export/data/url.txt

添加以下数据内容

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.2 需求

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

3.3 parse_url

➢ 功能

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

➢ 语法

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'  

➢ 测试

➢ 查询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;

➢ 实现需求

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

e6bcb17c7032436386b60dc123940d6a.png

➢ 问题

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


3.3.4 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;

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

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

➢ 实现需求

select parse_url_tuple(url,“HOST”,“PATH”,“QUERY”) as (host,path,query) from tb_url;

➢ 问题

当前实现的过程中,通过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)

3.4 UDTF函数的问题

Hive中的一对多的UDTF函数可以实现高效的数据转换,但是也存在着一些使用中的问题,UDTF函数对于很多场景下有使用限制,例如:select时不能包含其他字段、不能嵌套调用、不能与group by等放在一起调用等等。

UDTF函数的调用方式,主要有以下两种方式:

方式一:直接在select后单独使用

方式二:与Lateral View放在一起使用


3.5 Lateral View侧视图

3.5.1 功能

Lateral View是一种特殊的语法,主要用于搭配UDTF类型功能的函数一起使用,用于解决UDTF函数的一些查询限制的问题。

侧视图的原理是将UDTF的结果构建成一个类似于视图的表,然后将原表中的每一行和UDTF函数输出的每一行进行连接,生成一张新的虚拟表。这样就避免了UDTF的使用限制问题。使用lateral view时也可以对UDTF产生的记录设置字段名称,产生的字段可以用于group by、order by 、limit等语句中,不需要再单独嵌套一层子查询。

一般只要使用UDTF,就会固定搭配lateral view使用。

官方链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView


3.5.2 语法

lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*

基本语法如下

select …… from tabelA lateral view UDTF(xxx) 别名 as col1,col2,col3……

3.5.3 测试

➢ 单个lateral view调用,实现上述需求中的应用

select
  a.id as id,
  b.host as host,
  b.path as path,
  b.query as query
from tb_url a
lateral view parse_url_tuple(url,"HOST","PATH","QUERY") b as host,path,query;

➢ 多lateral view调用

select
  a.id as id,
  b.host as host,
  b.path as path,
  c.protocol as protocol,
  c.query as query
from tb_url a
lateral view parse_url_tuple(url,"HOST","PATH") b as host,path
lateral view parse_url_tuple(url,"PROTOCOL","QUERY") c as protocol,query;

➢Outer Lateral View

如果UDTF不产生数据时,这时侧视图与原表关联的结果将为空,如下图所示:

select
  id,
  url,
  col1
from tb_url
lateral view explode(array()) et as col1;

如果加上outer关键字以后,就会保留原表数据,类似于outer join

select
  id,
  url,
  col1
from tb_url
lateral view outer explode(array()) et as col1;

e26eac1c79be4d4ca88ab4d93665309c.png

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
28天前
|
安全 搜索推荐 Java
Java的URL与URLConnection技术深度解析
Java的URL与URLConnection技术深度解析
389 0
|
5天前
|
域名解析 存储 缓存
HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口
【6月更文挑战第23天】 HTTP请求流程概览:浏览器构建请求行含方法、URL和版本;检查缓存;解析IP与端口;TCP连接(HTTP/1.1可能需排队);三次握手;发送请求头与体;服务器处理并返回响应;TCP连接可能关闭或保持;浏览器接收并显示响应,更新缓存。HTTP版本间有差异。
21 5
|
4天前
|
分布式计算 大数据 调度
MaxCompute产品使用问题之为什么用python写的udf函数跑起来比本地还要慢
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4天前
|
机器学习/深度学习 分布式计算 DataWorks
MaxCompute产品使用问题之如何在UDF函数中访问外网
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4天前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之建了一个python 的 UDF脚本,生成函数引用总是说类不存在,是什么导致的
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4天前
|
JSON 分布式计算 大数据
MaxCompute产品使用问题之pyODPS3如何引用udf资源的函数
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
18天前
|
缓存 分布式计算 大数据
MaxCompute产品使用合集之行转列的函数如何与group by和聚合函数一起使用
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
18天前
|
分布式计算 DataWorks 大数据
MaxCompute产品使用合集之查询优化中对使用concat函数拼接起来的分区字段进行查询时,能否进行分区剪枝
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
21天前
|
存储 大数据 分布式数据库
使用Apache HBase进行大数据存储:技术解析与实践
【6月更文挑战第7天】Apache HBase,一个基于HDFS的列式存储NoSQL数据库,提供高可靠、高性能的大数据存储。其特点是列式存储、可扩展至PB级数据、低延迟读写及多版本控制。适用场景包括大规模数据存储、实时分析、日志存储和推荐系统。实践包括集群环境搭建、数据模型设计、导入、查询及性能优化。HBase在大数据存储领域扮演关键角色,未来有望在更多领域发挥作用。
|
23天前
|
SQL 分布式计算 MaxCompute
那些常忘的ODPS函数用法
那些常忘的ODPS函数用法
35 1

推荐镜像

更多