题目:给定表t,数据如下
str |
1011 |
0101 |
10010110 |
001010111000 |
输出如下数据
res |
1,3,4 |
2,4 |
1,4,6,7 |
3,5,7,8,9 |
思路:数据不是定长的,这里不能直接截取,那可以考虑进行split,但怎么进行呢,这里我们可以采用''进行切分,切分出的数组进行lateral view 展开。
构造数据:
with t as(select str fromvalues('1011'),('0101'),('10010110'),('001010111000') tmp(str))str 1011010110010110001010111000
SQL代码:注意split按''切分后的数组长度会+2,因为str前后也是''
select split('1011','');--[, 1, 0, 1, 1, ]
set odps.sql.hive.compatible=True;--hive兼容模式select str, concat_ws(",",collect_list(cast(index as string)))as res from(select str, index, chr from t lateral view posexplode(split(str,'')) a as index,chr ) b where chr ="1"groupby str str res 0010101110003,5,7,8,901012,4100101101,4,6,710111,3,4
此题应该还有其他解法,欢迎交流
拜了个拜