SQL进阶--1__如何使用hiveSQL遍历字符串

如何使用hiveSQL遍历字符串

  • 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),' '))

这里采用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,hive,数据仓库)