【发布时间】:2021-07-03 15:17:14
【问题描述】:
我在一列中有一个带分隔符的字符串:例如:
REG:aaaaa|REG:bbbbb|REG:cccc|IMP:abcd|IMP:efghi
列的长度可能因某些不同的输入而异。我想要以下输出
length(REG) : 3
length(IMP) : 2
【问题讨论】:
标签: sql hive hiveql amazon-athena presto
我在一列中有一个带分隔符的字符串:例如:
REG:aaaaa|REG:bbbbb|REG:cccc|IMP:abcd|IMP:efghi
列的长度可能因某些不同的输入而异。我想要以下输出
length(REG) : 3
length(IMP) : 2
【问题讨论】:
标签: sql hive hiveql amazon-athena presto
应该是这样的:
select
count(case when value like 'REG:%' then 1 end) REGcount
, count(case when value like 'IMP:%' then 1 end) IMPcount
from split('REG:aaaaa|REG:bbbbb|REG:cccc|IMP:abcd|IMP:efghi','[|]')
对于模式搜索,我不确定“[|]”是否有效或“\\|”。所以让我们知道
【讨论】:
您可以通过'(^|\\|)REG:' 拆分字符串 - 此正则表达式表示字符串开头的'REG:' 或'|REG:',然后取数组大小-1。
Hive 演示:
select size(split(str, '(^|\\|)REG:'))-1 as REG_cnt,
size(split(str, '(^|\\|)IMP:'))-1 as IMP_cnt
from
(--initial data
select 'REG:aaaaa|REG:bbbbb|REG:cccc|IMP:abcd|IMP:efghi' as str
)s
结果:
reg_cnt imp_cnt
3 2
对于 Presto/Athena:
select cardinality(regexp_split(str, '(^|\|)REG:'))-1 as REGcnt,
cardinality(regexp_split(str, '(^|\|)IMP:'))-1 as IMPcnt
from
(--initial data
select 'REG:aaaaa|REG:bbbbb|REG:cccc|IMP:abcd|IMP:efghi' as str
)s
结果:
reg_cnt imp_cnt
3 2
使用这种方法你不需要分解数组和聚合计数。
【讨论】: