【发布时间】:2021-12-31 16:18:31
【问题描述】:
我有一个字符串变量存储在hive 中,如下所示
stringvar
AA1,BB3,CD4
AA12,XJ5
我想计算(并过滤)正则表达式模式\w\w\d 出现的次数。在示例中,第一行显然有三个这样的示例。在不借助stringvar 的横向视图和爆炸(太贵)的情况下如何做到这一点?
谢谢!
【问题讨论】:
标签: sql regex hive hiveql cloudera
我有一个字符串变量存储在hive 中,如下所示
stringvar
AA1,BB3,CD4
AA12,XJ5
我想计算(并过滤)正则表达式模式\w\w\d 出现的次数。在示例中,第一行显然有三个这样的示例。在不借助stringvar 的横向视图和爆炸(太贵)的情况下如何做到这一点?
谢谢!
【问题讨论】:
标签: sql regex hive hiveql cloudera
您可以按模式拆分字符串并计算结果数组的大小 - 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
上面的方案是最灵活的一种,可以统计出现次数,用于复杂的过滤/加入/等。
如果您只需要过滤具有固定数量的模式出现或至少固定数量的记录并且不需要知道确切的计数,那么简单的 RLIKE 不拆分是最便宜的方法。
例如检查至少 2 次重复:
select 'AA1,BB3,CD4' rlike('\\w\\w\\d+,\\w\\w\\d+') --returns true, can be used in WHERE
【讨论】: