我是靠谱客的博主 典雅仙人掌,最近开发中收集的这篇文章主要介绍SQL一天一个小技巧:如何使用HQL遍历字符串0 需求1 数据分析2 小结欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
目录
0 需求
1 数据分析
2 小结
0 需求
- 遍历字符串,并以一个字符一行的形式显示出来
- 如遍历"a,b,c,d,e,f"字符串,使其每个字符都生成一行记录
1 数据分析
在hive中为我们提供了强大的posexplode()函数,该函数对数组结构的数据进行行转列,并对数组中每一位都生成一个索引值.该函数强大之处就是为数组中每一位生成索引。因此我们可以利用该函数来生成字符串中的每一位的索引,达到遍历的效果。
具体如下所示:
select posexplode(split('a,b,c,d,e,f',','))
结果如下:
+------+------+--+
| pos | val |
+------+------+--+
| 0 | a |
| 1 | b |
| 2 | c |
| 3 | d |
| 4 | e |
| 5 | f |
+------+------+--+
可以看出生成了pos列及val列,pos列即为索引列,这样就达到了我们所需要的结果,将每个字符生成一行记录。
如果是"abcdef"这样的串,则比较麻烦,生成索引如下
(1)先根据字符串长度生成对应的索引,具体如下:
select posexplode(split(space(length("abcdef")-1),' '))
结果如下:
+------+------+--+
| pos | val |
+------+------+--+
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
+------+------+--+
这里采用space()函数生成指定长度的空格,来生成对应索引值,注意的是不是采用字符串长度,而是长度减1,原因是split()函数按照指定字符切割的时候生成的是N+1个长度数组。如:
select split('a','a')
+----------+--+
| _c0 |
+----------+--+
| ["",""] |
+----------+--+
按照字符a切割的时候生成两个位置上的空串,生成的位置个数为指定字符数+1.
(2)针对生成的索引值按行进行展开,具体代码如下:
select 'abcdef' as str --需要遍历的字符串
,pos --索引
,substr("abcdef",pos+1,1) --获取字符串中索引位置的值
,substr("abcdef",0,pos+1) --从起始位置开始到当前位置的字符串
from(
select posexplode(split(space(length("abcdef")-1),' '))
) t
具体计算结果如下:
+---------+------+------+---------+--+
| str | pos | _c2 | _c3 |
+---------+------+------+---------+--+
| abcdef | 0 | a | a |
| abcdef | 1 | b | ab |
| abcdef | 2 | c | abc |
| abcdef | 3 | d | abcd |
| abcdef | 4 | e | abcde |
| abcdef | 5 | f | abcdef |
+---------+------+------+---------+--+
2 小结
在本文给的案例中最常见的使用场景包括遍历字符串并为其中的每个字符差生一行数据,其实就是字符串的展开,然后根据展开的数据进行相关操作或者遍历字符串并根据某些特定的字符或分割符生成相应行数的记录。本文的技巧如下:
- (1)利用posexplode()函数生成索引
- (2)已知某个长度值,根据长度值生成索引的方法。space()函数及posexplode()函数
- (3)通过索引值及substr()函数获取当前索引处的字符串值。
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路
最后
以上就是典雅仙人掌为你收集整理的SQL一天一个小技巧:如何使用HQL遍历字符串0 需求1 数据分析2 小结欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路的全部内容,希望文章能够帮你解决SQL一天一个小技巧:如何使用HQL遍历字符串0 需求1 数据分析2 小结欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复