需求
遍歷字符串,並以一個字符一行的形式顯示出來,如遍歷"a,b,c,d,e,f"字符串,使其每個字符都生成一行記錄;
思路分析
在hive中可以借助posexplode()函數對數組結構的數據進行(xing)行(hang)轉列,並對數組中每一位都生成一個索引值.該函數強大之處就是為數組中每一位生成索引。進而借助生成的索引,來遍歷字符串。
select posexplode(split('a,b,c,d,e,f', ','));
結果
posexplode生成了pos列及val列,pos列是索引列,這樣就達到了遍歷字符串的結果,將每個字符生成一行記錄。
不過有時候需求側的字符串沒有分隔符,比如"abcdef"這樣的串,則比較麻煩,生成索引如下:
select 'abcdef' as str, --遍歷的字符串 pos, --索引 substr("abcdef", pos + 1, 1),--獲取字符串中索引位置的值 substr("abcdef", 0, pos + 1) --從起始位置開始到當前位置的字符串 from (select posexplode(split(space(length("abcdef") - 1), ' '))) t
結果
總結
遍歷字符串其實是借助 posexplode 函數生成每個字符的索引打散每個字符實現遍歷字符串的效果的。可以研究一下 posexplode 的一些細節。