如何获取 hive 中子字符串的计数

Posted

技术标签:

【中文标题】如何获取 hive 中子字符串的计数【英文标题】:How to get count of substring in hive 【发布时间】:2021-07-03 15:17:14 【问题描述】:

我在一列中有一个带分隔符的字符串:例如:

 REG:aaaaa|REG:bbbbb|REG:cccc|IMP:abcd|IMP:efghi

列的长度可能因某些不同的输入而异。我想要以下输出

length(REG) : 3
length(IMP) : 2

【问题讨论】:

【参考方案1】:

应该是这样的:

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','[|]')

对于模式搜索,我不确定“[|]”是否有效或“\\|”。所以让我们知道

【讨论】:

【参考方案2】:

您可以通过'(^|\\|)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

使用这种方法你不需要分解数组和聚合计数。

【讨论】:

以上是关于如何获取 hive 中子字符串的计数的主要内容,如果未能解决你的问题,请参考以下文章

如何在字符串中查找子字符串,其中子字符串位于 Access Query 的单独表中?

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

hive 或 impala 函数来获取字符串的子字符串

C语言 计算字符串中子串出现的次数 求更改

Hive 查询以获取字符串中给定键的值

jstree中想要选中子节点,父节点就会变成选中状态,需要如何修改。