计算正则表达式模式在配置单元中出现的次数

count number of times a regex pattern occurs in hive

我有一个字符串变量存储在 hive 中,如下所示

stringvar
AA1,BB3,CD4
AA12,XJ5

我想计算(并过滤)正则表达式模式 \w\w\d 出现了多少次。在示例中,第一行显然有三个这样的示例。如果不借助侧视图和 stringvar(太贵)的爆炸,我怎么能做到这一点?

谢谢!

您可以按模式拆分字符串并计算结果数组的大小 - 1。

演示:

select size(split('AA1,BB3,CD4','\w\w\d'))-1  --returns 3
select size(split('AA12,XJ5','\w\w\d'))-1     --returns 2
select size(split('AAxx,XJx','\w\w\d'))-1     --returns 0
select size(split('','\w\w\d'))-1             --returns 0

如果列可以为空,则应特别小心。例如像这样(取决于你在 NULL 的情况下需要返回什么):

select case when col is null then 0
            else size(split(col,'\w\w\d'))-1 
       end

或者使用 NVL 函数简单地将 NULL 转换为空字符串:

select size(split(NVL(col,''),'\w\w\d'))-1 

上面的方案是最灵活的方案,你可以统计出现的次数,用于复杂的filtering/join/etc。

如果您只需要过滤具有固定模式出现次数或至少固定次数的记录,而不需要知道确切的计数,那么不拆分的简单 RLIKE 是最便宜的方法。

例如检查至少 2 次重复:

select 'AA1,BB3,CD4' rlike('\w\w\d+,\w\w\d+') --returns true, can be used in WHERE