计算正则表达式模式在配置单元中出现的次数
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
我有一个字符串变量存储在 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