SQL: lateral view & explode & split (分割&侧视图)

支持该函数:Hive、阿里云odps sql

1.阿里云

初始样本数据SQL

--初始样本数据
select 
	distinct 
	get_json_object(extra_params,'$.order_id') order_id,
	get_json_object(extra_params,'$.aptitude_id') user_id
from jz_daojia.f_pt_traffic_normalized
where dt>='20200316'
and event_id='click_need_submit_aptitude'
and get_json_object(extra_params,'$.order_id') in (1123208136957624705,1123218787145351552,1123163859560874369)
;

初始样本数据结果截图

已知 user_id 字段内容如上:有的行字段内只有1个数字,有的行字段内有多个数字且用“,”分隔开;

需求场景:希望将包含多个数字的字段内容根据“,”给单独拆分出来,且拆开后user_id中的每一部分都跟原始这行数据的其他字段组成新的一行数据;

1.1 单独将 user_id 这一个字段根据“,”分隔开且每一部分重新生成一行数据,可以使用 explodesplit 函数实现

SQL如下:

select
	explode(split(a.user_id,',')) as user_id_2
from
( --初始样本数据
select 
	distinct 
	get_json_object(extra_params,'$.order_id') order_id,
	get_json_object(extra_params,'$.aptitude_id') user_id
from jz_daojia.f_pt_traffic_normalized
where dt>='20200316'
and event_id='click_need_submit_aptitude'
and get_json_object(extra_params,'$.order_id') in (1123208136957624705,1123218787145351552,1123163859560874369)
) a 
;

数据结果如下:

1.2 将 user_id 这一个字段根据“,”分隔开且每一部分重新生成一行数据的同时,把原始 user_id 这一行其他字段的内容继承下来

期望的数据结果:

如果用下面的SQL,会报错,原因是explode和split函数不能和其他字段直接使用

select
	a.order_id,
	explode(split(a.user_id,',')) as user_id_2
from
( --初始样本数据
select 
	distinct 
	get_json_object(extra_params,'$.order_id') order_id,
	get_json_object(extra_params,'$.aptitude_id') user_id
from jz_daojia.f_pt_traffic_normalized
where dt>='20200316'
and event_id='click_need_submit_aptitude'
and get_json_object(extra_params,'$.order_id') in (1123208136957624705,1123218787145351552,1123163859560874369)
) a 

报错截图:

此时要想获取期望的数据,需要用到 lateral view (侧视图)

具体SQL如下:

select
	a.order_id,
	a.user_id,
	b.user_id_2
from
( --初始样本数据
select 
	distinct 
	get_json_object(extra_params,'$.order_id') order_id,
	get_json_object(extra_params,'$.aptitude_id') user_id
from jz_daojia.f_pt_traffic_normalized
where dt>='20200316'
and event_id='click_need_submit_aptitude'
and get_json_object(extra_params,'$.order_id') in (1123208136957624705,1123218787145351552,1123163859560874369)
) a 
lateral view explode(split(a.user_id,',')) b as user_id_2
;

数据结果如下:

SQL中的 lateral view explode(split(a.user_id,',')) b as user_id_2 相当于把a虚拟表的数据根据a表中的user_id字段按照“,”做了拆分且拆分后的每一个部分都跟该行原始的其他字段的数据单独成为了一个新的数据行,可以理解为新增加了一个user_id_2字段,该字段的内容即为a表中user_id字段拆分开的每一个部分;

其中b为生成新的虚拟表的别名,user_id_2 为将a表user_id字段内容处理后生成新的字段的字段别名,此处的表别名b,as符号,字段别名user_id_2均不能省略,缺少任何一个都会报错;

lateral view explode(split(a.user_id,',')) b as user_id_2 只要写在要处理的原始表名后面即可,此处a表是一个子查询,所以样式是这样,如果a子查询处是一个物理表 jz_daojia.order_detail ,SQL可以写成如下:

select
	a.order_id,
	a.user_id,
	b.user_id_2
from jz_daojia.order_detail a 
lateral view explode(split(a.user_id,',')) b as user_id_2
;

 lateral view 也可以多重使用,如果a表中custom_id字段内容情况跟user_id类似,如果都想拆开可以写成如下SQL形式,且每次拆分后都跟之前的数据按照笛卡尔积进行关联:

select
	a.order_id,
	a.user_id,
	b.user_id_2,
	a.custom_id,
	c.custom_id_2
from jz_daojia.order_detail a 
lateral view explode(split(a.user_id,',')) b as user_id_2
lateral view explode(split(a.custom_id,',')) c as custom_id_2
;

2.Hive 

转载链接:hive中的lateral view 与 explode函数的使用_guodong2k的博客-CSDN博客(hive中的lateral view 与 explode函数的使用) 

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值