网站流量日志分析--扩展--hive lateral view 侧视图的使用|学习笔记

简介: 快速学习网站流量日志分析--扩展--hive lateral view 侧视图的使用

开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第三阶段) 网站流量日志分析--扩展--hive lateral view 侧视图的使用】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/695/detail/12205


网站流量日志分析--扩展--hive lateral view 侧视图的使用


内容介绍:

一、函数 UDTF 使用

二、总结


一、函数 UDTF 使用

在 hive 当中看到非常重要的侧视图,视图的概念并不陌生,可以理解为虚拟的表结构,在 hive 当中侧视图有什么作用?这就说到 udtf  函数,翻译成中文叫做表生成函数,把数据变成一个类似于虚拟的表结构。侧视图正是为了配合 UDTF ,为了更加精准辨答,通过例子来做一个展示,这里以 hive 当中内置的 UDTF 举例,这个函数叫做 explode ,它是一个非常标准的 UDTF 函数,这个函数可以接受这样的阐述,举个例子,比如传递个 array 这样的复核理性,它可以将 array 当中的每一个元素变成一行,比如 array123,1一行,2一行,3一行,第二个如果传递的是一个mapinsr,它可以将 map 当中的每一对 keyv 对变成一行输入,key 一行,value 一行,keyv1,keyv2 一行,keyv3keyv4 一行,输入一个输出多个,正是所谓的标准的 UDTF 函数。

接下来通过具体例子来看一下到底 UDTF 函数是什么样的,以及和测数之间有什么关系。这里有结构化的数据文件,字段非常清晰,有001、ID ,后面两个字段是复核类型的字段,都是 array。要想把数据成功,首先建立一个表叫做 create table,名字叫 test-message 当中 id int 为第一个字段,name string 为第二个字段,location array 对应第三个字段,那么 city 对应第四个字段。

既然这里是一个复核类型的字段,指定当中的分隔符 row format delimited 首先指定 fields terminated by,字段之间的分隔符为逗号,然后 collection items terminated by 又是集合元素之间分隔符为竖线,这样可以做一个映射,

首先创建表结构文件叫做 text message.txt,打开服务器,输入 vrm 去创建一下,把表结构复制再做一个粘贴,最后保存。首先把建表语句执行一下,打开 hive 客户端,连接到服务器上,建立表,

image.png

接下来使文件加载到这个表当中,做一个映射复制执行一下,执行完成之后可以用 select 命令做一个验证看这个表是否映射成功,可以发现映射的非常完美,当中的 id 和name 是一个基本类型,后面的 location 和city 是一个数主类型。

image.png

接下来这样一个表结构,操作非常方便,如果直接 select location 返回是两个数主,发现返回的就是这两个数主(如下图),

image.png

接下来既然是数主,想获取里面的元素,可以通过下标的形式来获取,比如说获取里面的第二个元素,注意下标是从0开始,中括号取个1,第一个返回的是 China, 第二个返回是 England,这是正常的操作,虽然它是复核类型操作起来没有区别。

接下来看一下 explode 所谓的UDTF 函数是干什么用的,通过发现它可以将列表中的每一个元素生成一行,这里如果把 locate 作为一个参数传递,字段会变成三行,整体来看变成六行,分别是 USA ,China, Japan,usa ,England,Japan,把函数应用一下,这时候可以发现六行的一个字段,这时候为了方便可以起一个别名 as location简写 lc ,这时候发现 lc 表的结构一个字段,变成了六行,正好呼应了 UDTF 函数,输入一行输出多行。

问题在于接下来需求,这些城市对应的姓名是哪个用户的,在进行扩展的时候再来一个字段叫做 name 再加一个逗号,因为这两个字段都是表当中存在的字段,回车发现报错,while compiling statement 在编译出现了错误, socre 都没有符合,出现了错误。具体往后看叫做 UDTF 函数不支持在它的编译当中有 select 查行条件,不允许其他表达出现;比如说 name 这个字段出现在表当中是非法的,不允许出现它。这时候就好奇推导没有任何问题 ,name 明明就是表的结构为什么不可以?

首先要明确 test message 这个表是这样子的,复制一下,左边这个表结构叫做 test message ,起个别名叫做表 A,接下来 explode 函数还会生成另外一个表结构,这个表是一个虚拟的表,接着往下看,这是第二个表结构,起名叫 B,这就意味着接下来经过这个函数之后,现在有两个表结构,一个是 A 表是原来表内容,一个是 B 表通过函数来生成的,准确来说没有太多关系,相当于两个表,但是刚才执行的是

image.png

什么样子的,叫做 select name ,剖析一下,这个语句就比较有意思,看 from 后面的关键是 from test message 。可以理解为表 A ,去操作 A 表,在操作 A 表的时候,既想获得 A 表的字段,又想获得另外一个 B 表的字段,现在确定操作的是 A 表,只能操作 A 表当中的字段 id、name、location、city ,想去操作这个东西不可能去跨表操作,所以说在语法身边爆出来。在现实生活当中,确实需要这种操作怎么办?就需要操作原来的同时又要操作表生成的虚拟表,这时候就存在一个问题,有没有哪种能力可以让表直接产生关联,这就是所说的 later view 侧视图的功能。

接下来看一下侧视图功能非常明确,它就是 UDTF 函数天生好搭档,叫做 UDTF 能够提取字段把它作为拆分变成多个字段,但是并不会塞回到原来的数据表当中,但是当需要操作有关,这时候就要引用侧视图, hive 提供了天生的好搭档,当使用侧视图就可以将拆分的字段数据与原始表的数据关联上(如下图)。把真实的表和 UDTF 生成虚拟的表做一个关联操作。

整个侧视图使用的语法规则非常有意思,叫做 table A lateral view UDTF 函数,

image.png

左边的的是写得非常明确,原来的表在左边,虚拟生成的表在右边,后面有一个虚拟表里面的名字,as 指定是虚拟表当中的字段,如果不指定有默认的值,可以做一个简单演示,首先先不看之前的表达式, from test message 根据上图 test message 是左边的,叫做 test message 原来的表去测试 explode 函数, B 表起个别名叫做 subview,后面叫做 itcase ,首先看一下,如果不写 as 是什么样子的,把 select subview,*from test message later view explode (location) subview复制一下,这时候注意,测试的时候把虚拟的表起个别名叫做 subview,查出来发现字段做出了拆分,一行变成多行,总共达到六行,但是字段名字叫做 col,说明默认起自带的名字,但是可以使用 as 指代它的别名,就像 as itcast,发现这个字段变成 itcast ,所以说 as 后面通常用指定字段;

image.png

如果只是简单的使用并没有太多的意义,重要的在于下面,当把原来的表和虚拟表侧视图做了关联之后,既操作原来的表,又可以操作虚拟的表。name 是原来表当中的字段,subview 是虚拟表当中的字段,这时候结果和原来一样,name 是原来表的内容,lc 是拆分出来虚拟表的内容,如果刨根问底,大概相当于上图表相关联的操作,左边是一条记录,右边是一个表,左边的分别跟右边相关联。

image.png


二、总结

首先第一点叫做 UDTF  是做什么的, UDTF 函数表生成函数,输入一行输出多行,输出的可以看成虚拟的表结构,因为输出多行像一个虚拟的表结构,所以叫表生成函数,但是其生成的表结构并不会跟之前的原来的表产生关系,就相当于黑线划得左右两边分别是两个不同的表,一个是真的表,一个是虚拟的表,这时候 later view 是UDTF 天生好搭档,使用它叫做原来的表可以把 UDTF 函数生成的表结构与原来的表结构进行相关联操作,格式要记住,原来的表叫做 tableA lateral view UDTFs,起个名字叫做虚拟表名,通常叫做侧视图名, as 为虚拟字段名1,虚拟字段名2。

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
SQL HIVE
hive中的 lateral view
hive中的 lateral view
38 0
|
1月前
|
SQL JSON 算法
hive学习笔记
hive学习笔记
|
3月前
|
小程序 Linux 数据安全/隐私保护
Linux学习笔记十六:日志管理
Linux学习笔记十六:日志管理
|
3月前
|
监控 安全 前端开发
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
36 0
|
4月前
|
存储 SQL 分布式计算
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
Hadoop(HDFS+MapReduce+Hive+数仓基础概念)学习笔记(自用)
263 0
|
4月前
|
安全 程序员 Python
Python-logging详解(彩色日志扩展,多进程安全等)
Python-logging详解(彩色日志扩展,多进程安全等)
40 0
|
4月前
|
SQL 分布式计算 Hadoop
Hadoop学习笔记(HDP)-Part.15 安装HIVE
01 关于HDP 02 核心组件原理 03 资源规划 04 基础环境配置 05 Yum源配置 06 安装OracleJDK 07 安装MySQL 08 部署Ambari集群 09 安装OpenLDAP 10 创建集群 11 安装Kerberos 12 安装HDFS 13 安装Ranger 14 安装YARN+MR 15 安装HIVE 16 安装HBase 17 安装Spark2 18 安装Flink 19 安装Kafka 20 安装Flume
106 1
Hadoop学习笔记(HDP)-Part.15 安装HIVE
|
5月前
|
Java
JVM学习笔记-如何在IDEA打印JVM的GC日志信息
若要在Idea上打印JVM相应GC日志,其实只需在Run/Debug Configurations上进行设置即可。
66 0
|
6月前
|
缓存 NoSQL Redis
Redis学习笔记-AOF日志&重写机制
Redis学习笔记-AOF日志&重写机制
82 0
|
6月前
|
NoSQL Redis
Redis学习笔记-AOF 日志和 RDB快照
Redis学习笔记-AOF 日志和 RDB快照
65 0