🌿挑战100天不停更,刷爆 hive sql🧲
NUM: 第5天 - 求连续值(不借助其他表)
详情请点击🔗我的专栏🖲,共同学习,一起进步~
🧨不废话,刷题~~🧨
执行结果
方法一
思路
- 根据
space()
获取字符串的长度,space(int i)
返回i
长度的字符串,再通过split()
根据字符串切割为想要的数组 - 通过
lateral view
侧视图+posexplode()
将行转为列,再取出对应的索引值+1即可
问题:
lateral view
侧视图?(参考)Lateral View
和**UDTF**
类功能函数一起使用,表中的每一行和UDTF
函数输出的每一行进行连接,生成一张新的虚拟表,可以对UDTF
产生的记录设置字段名称,新加的字段可以使用在sort by,group by
等语句中,不需要再套一层子查询。**Lateral View**
的作用是可以扩展原来的表数据
posexplode()
函数?(参考)- 将一行数据拆解成多行
- 结合
split()
获取自定义的长度和行数 - 返回值 pos:索引,val:值
代码
SELECT id_start + pos as id
from (
SELECT 1 as id_start,
1000 as id_end) m lateral view posexplode(split(space(id_end-id_start),
'')) t as pos,val;
方法二
思路
同上,
- 使用
explode(x)
将行转为多列 row_number() over()
开窗函数获取对应的行号即可
代码
select
row_number() over() as id
from
(select split(space(99),' ') as x) t
lateral view explode(x) ex
总结
1,row_number()取行号
2,posexplode取索引