前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[1179]hive的lateral view用法

[1179]hive的lateral view用法

作者头像
周小董
发布2023-10-10 08:27:49
4560
发布2023-10-10 08:27:49
举报
文章被收录于专栏:python前行者

1. lateral view 简介

hive函数 lateral view 主要功能是将原本汇总在一条(行)的数据拆分成多条(行)成虚拟表,再与原表进行笛卡尔积,从而得到明细表。配合UDTF函数使用,一般情况下经常与explode函数搭配,explode的操作对象(列值)是 ARRAY 或者 MAP ,可以通过 split 函数将 String 类型的列值转成 ARRAY 来处理。

【语法格式】

代码语言:javascript
复制
select col_A,col_B,tmp_table.tmp_col 
from test_table 
lateral view explode(split(col_C,'分隔符')) tmp_table as tmp_col
where partition_name='xxx';

【说明】 col_A,col_B,col_C: 都是原表 test_table 的列(字段); tmp_table:explode形成的新虚拟表,可以不写; tmp_col:explode 形成的新列(字段);

2. 实操

2.1 建表(hive)

创建一个“部门利润表”,按照日期分区,一共三个字段,“部门编号”、“部门层级树”、“利润(万元)”。DDL语句如下:

代码语言:javascript
复制
drop table if exists zero_test_01:
create table zero_test_01 (
    DEPT_NO    string    comment'部门编号',
    DEPT_TREE  string    comment'部门层级树',
    BENIFIT    int       comment'利润(万元)'
)
comment '测试-部门利润表'
partitioned by (deal_date string comment '日期分区' )
stored as orc;

【字段说明】:DEPT_TREE 字段是按照“一级部门编号.二级部门编号.三级部门编号” 模式进行取值的。

2.2 插入数据

往“20220516”分区中插入三条数据。

代码语言:javascript
复制
alter table zero_test_01 drop if exists partition (DEAL_DATE='20220516');
insert into table zero_test_01 partition (DEAL_DATE='20220516')
select '101','A.A1.101',50;
insert into table zero_test_01 partition (DEAL_DATE='20220516')
select '102','A.A1.102',20;
insert into table zero_test_01 partition (DEAL_DATE='20220516')
select '201','A.A2.201',80;

DEPT_NO(部门编号)

DEPT_TREE(部门层级树)

BENIFIT(利润[万元])

101

A.A1.101

50

102

A.A1.102

20

201

A.A2.201

80

2.3 转成多行

利用 lateral view 和 explode 函数将 DEPT_TREE(部门层级树) 列按照.分割转成多行,通过结果可以看到,lateral view函数将 “部门层级树” 字段炸开进行了扩展,每个部门(DEPT_NO)都有与之对应的利润(BENIFIT),从三行数据直接变成9行数据。

代码语言:javascript
复制
select tmp_dept_no as DEPT_NO, BENIFIT
from zero_test_01 
LATERAL VIEW explode (split(DEPT_TREE, '\\.')) tmp as tmp_dept_no
where DEAL_DATE='20220516';

DEPT_NO

BENIFIT

A

80

A2

80

201

80

A

20

A1

20

102

20

A

50

A1

50

101

50

2.4 汇总求和

对部门利润进行向上汇总求和,可以看到每个部门的总利润。

代码语言:javascript
复制
select tmp_dept_no as DEPT_NO, sum(BENIFIT) as BENIFIT
from zero_test_01
LATERAL VIEW explode (split(DEPT_TREE, '\\.')) tmp as tmp_dept_no
where DEAL_DATE='20220516'
group by tmp_dept_no;

DEPT_NO

BENIFIT

A

150

A1

70

A2

80

101

50

102

20

201

80

参考:https://blog.csdn.net/weixin_41579433/article/details/124799660

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. lateral view 简介
  • 2. 实操
    • 2.1 建表(hive)
      • 2.2 插入数据
        • 2.3 转成多行
          • 2.4 汇总求和
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档