当前位置: 首页 > 工具软件 > regexpp > 使用案例 >

Hive 正则匹配函数 regexp_extract和 regexp_replace和rlike

松俊美
2023-12-01

介绍一下主要的功能函数.

参考:https://www.jianshu.com/p/3bcc06b1294b

regexp_extract
相当于python当中的re.search:

遍历匹配,仅可以获取到字符串当中第一个满足匹配条件的字符串然后返回,如果没有匹配到字符串,则返回空串(re是None).

group() :不管有没有分组将匹配到的结果全部拿出来,等价于group(0),返回类型为字符串,

group(1):只获取第一个分组部分的结果,

group(2):只获取第一个分组部分的结果.

hive> desc function extended regexp_extract;
OK
regexp_extract(str, regexp[, idx]) - extracts a group that matches regexp
Example:

SELECT regexp_extract(‘100-200’, ‘(\d+)-(\d+)’, 1) FROM src LIMIT 1;
‘100’
Time taken: 0.009 seconds, Fetched: 4 row(s)
第一参数:要处理的字段 第二参数: 需要匹配的正则表达式

第三个参数:

0 是显示与之匹配的整个字符串 1 是显示第一个括号里面的 2 是显示第二个括号里面的字段.

注意点: python当中的元字符\d在hive当中为\d,如果希望将\作为一个普通的字符,需要用四个\\进行替代.

实例程序1:

python:
re.search(’(.+?),\s(.+?)\s:\s(.+)’,‘Hello, Mr.Gumby : 2016/10/26’,flags=0).group(0);
re.search(’(.+?),\s(.+?)\s:\s(.+)’,‘Hello, Mr.Gumby : 2016/10/26’,flags=0).group(1);
re.search(’(.+?),\s(.+?)\s:\s(.+)’,‘Hello, Mr.Gumby : 2016/10/26’,flags=0).group(2);
re.search(’(.+?),\s(.+?)\s:\s(.+)’,‘Hello, Mr.Gumby : 2016/10/26’,flags=0).group(3);

hive:
select regexp_extract(‘Hello, Mr.Gumby : 2016/10/26’,’(.+?),\s(.+?)\s:\s(.+)’,0);
select regexp_extract(‘Hello, Mr.Gumby : 2016/10/26’,’(.+?),\s(.+?)\s:\s(.+)’,1);
select regexp_extract(‘Hello, Mr.Gumby : 2016/10/26’,’(.+?),\s(.+?)\s:\s(.+)’,2);
select regexp_extract(‘Hello, Mr.Gumby : 2016/10/26’,’(.+?),\s(.+?)\s:\s(.+)’,3);

运行结果:

Hello, Mr.Gumby : 2016/10/26
Hello
Mr.Gumby
2016/10/26

regexp_replace
replace all substrings of str that match regexp with rep

将正则表达式 pattern 匹配到的字符串替换为 repl 指定的字符串.

hive> desc function extended regexp_replace;
OK
regexp_replace(str, regexp, rep) - replace all substrings of str that match regexp with rep
Example:

SELECT regexp_replace(‘100-200’, ‘(\d+)’, ‘num’) FROM src LIMIT 1;
‘num-num’
Time taken: 0.012 seconds, Fetched: 4 row(s)
实例程序:

hive> select regexp_replace(“the sum of 7 and 9 is [7+9].”,"\[.+\]",16);
OK
the sum of 7 and 9 is 16.
Time taken: 0.077 seconds, Fetched: 1 row(s)
反斜杠参考文档:https://blog.csdn.net/weixin_34236869/article/details/86364233

like和rlike
如果re.findall返回的不是空列表,则rlike对应的返回就是true.

rlike功能和like功能一致,只是like是后面只支持简单表达式匹配(%),其中""表示任意单个字符,字符”%”表示任意数量的字符。

而rlike则支持标准正则表达式语法,所以如果正则表达式使用熟练的话,建议使用rlike,功能更加强大。

所有的like匹配都可以被替换成rlike。反之,则不行。注意事项:like是从头逐一字符匹配的,但是rlike则不是。

个人认为:可以用python当中的re.findall或者re.search来学习rlike.

OK
str rlike regexp - Returns true if str matches regexp and false otherwise
Synonyms: regexp
Example:

SELECT ‘fb’ rlike ‘.*’ FROM src LIMIT 1;
true
Time taken: 0.016 seconds, Fetched: 5 row(s)
实例:

re.findall(‘foo’,‘foobar’);
[‘foo’]
hive> select ‘foobar’ rlike ‘foo’ ;
OK
true

报错整理
错误1:

当前我有一段sql,如下,在shell里面运行没有错误:

select
dt,
regexp_replace(regexp_replace(trim(corp_name), ‘"’, ‘’), ‘,’, ‘,’) corp_name,
user_log_acct pin
from
gdm.gdm_m01_userinfo_enterprise_da
where 1=1
and dt between ‘2019-11-12’ and ‘2019-11-12’
and dj_state = 1
and status = 1
GROUP BY dt,
regexp_replace(regexp_replace(trim(corp_name), ‘"’, ‘’), ‘,’, ‘,’),
user_log_acct
但是当我用hive -e调用的时候,代码如下:

hive -e "
select
dt,
regexp_replace(regexp_replace(trim(corp_name), ‘"’, ‘’), ‘,’, ‘,’) corp_name,
user_log_acct pin
from
gdm.gdm_m01_userinfo_enterprise_da
where 1=1
and dt between ‘2019-11-12’ and ‘2019-11-12’
and dj_state = 1
and status = 1
GROUP BY dt,
regexp_replace(regexp_replace(trim(corp_name), ‘"’, ‘’), ‘,’, ‘,’),
user_log_acct "
报错:

FAILED: SemanticException [Error 10004]: Line 1:7 Invalid table alias or column reference ‘dt’: (possible column names are: )
呵呵,原因如下:

解决方案:

shell下面"前面加三个\,python中加6个。

 类似资料: