Hive的Lateral View
# lateral view 简介
**hive中的 lateral view 主要功能是将原本汇总在一条(行)上的数据根据表函数拆分成多条(行)成为虚拟表,然后再与原表进行拼接,从而得到粒度更细的表。lateral view配合UDTF函数使用,一般情况下经常与explode函数搭配,explode的操作对象(列值)是 ARRAY 或者 MAP ,有时候使用array函数将多列变成数组再进行转换,也可以通过 split 函数将 String 类型的列值转成 ARRAY 来处理。**
**语法格式如下:**
```
select col1
,...
,tmp_col
from sometable
lateral view explode(array) tmp_table as tmp_col;
```
* **col1 ,.... 都是原始表sometable里面的字段**
* **tmp_table 是explode生成的包含一列的虚拟表的别名**
* **tmp_col 是explode生成的新列的别名,select查询可以直接使用这个列名**
# 举例说明
**举例说明:test_table数据如图所示:包含用户ID、hobbies两列,其中bobbies列数据类型是数组类型的。**
**现需将数据转换为 下图形式,方便统计汇总。**
**这时可以使用explode将hobbies列展开:**
```
select explode(hobbies) hobby from test_table;
```
**查询结果如下图所示:**
**那如何将上述结果与ID、hobbies列拼接在一起呢?可以这么写么?**
```
select ID,hobbies,explode(hobbies) hobby from test_table;-- 错误的用法
```
**上面的这种写法是不对的,这样hive并不能自动的对ID、hobbies列进行扩充,如果想要实现扩充还需要结合lateral view来实现**
```
select ID
,hobbies
,hobby
from test_table
lateral view explode(hobbies) t as hobby;
```
**lateral view 会自动的将test_table 与 explode的结果进行连接,因此可以查询到想要的结果。**
# 案例
## 1、
```
-- 创建表结构
-- 如果表存在,先删除表
drop table if exists knights_game;
-- 创建表结构
create table knights_game(
gameID string
,tags string
)row format delimited
fields terminated by '\t';
-- 加载本地数据到表中
load data local inpath 'data/hive_data/UDTF.tsv' into table knights_game;
-- 查看表中的内容
select * from knights_game limit 10;
```
**tags 是由多个json字符串使用**`-`拼接在一起的字符串,现为了统计分析每个gameid的信息,需要将tags展开出一个个的tag,然后再做统计。可以先使用split函数对tags做拆分:
```
select split(tags,'-') from knights_game;
```
**这时每行数据由字符串转换为字符串数组:**
**对数组使用exploded函数进行扩充:**
```
select explode(split(tags,'-')) from knights_game;
```
**如果想与其他的信息关联还需使用lateral view联用:**
```
select gameID
,tags
,tag
from knights_game
lateral view explode(split(tags,'-')) t as tag;
```
**一般的我们还会对tag中的json字符串进行解析,提取更细粒度的信息,这时还需要使用get_json_object函数:**
```
select
gameID
,get_json_object(tag,'$.tagid') tagid
,get_json_object(tag,'$.tagname') tagname
,get_json_object(tag,'$.parent') parent
from knights_game
lateral view explode(split(tags,'-')) t as tag;
```
评论(0)

暂无数据