前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache Hive Regexp

Apache Hive Regexp

作者头像
DataScience
发布2019-12-30 17:37:12
2.7K0
发布2019-12-30 17:37:12
举报
文章被收录于专栏:A2DataA2Data

Apache Hive Regexp

(正则表达式)

Apache Hive Regexp

正则案例

⊙hive 通过regexp_extract()

取域名中.com/.cn前的字符串?

例: 5.aaa.com
a.b.cccc.cn
567.com.cn
通过regexp_extract(),获得:
aaa
cccc
567

答:
regexp_extract(col_name, '(.*\\.)?([^\\.]+)\\.(com(\\.cn)?|(?<!\\.com\\.)cn)$',2)




hive中巧用正则表达式的贪婪匹配

需求:

从字符串"979|7.10.80|8684"中提取最后一个竖线|后面的内容,
但是在这个字符串中,竖线的个数不是固定的 。

使用hive中的regexp_extract函数实现如下:

Sql代码  
select regexp_extract('979|7.10.80|8684','.*\\|(.*)',1) from a2data.test limit 1;    
OK    
8864  
由于正则表达式的贪婪匹配,一直会匹配到最后一个竖线。



如果要取第一个竖线前面的内容,实现如下:

Sql代码  
select regexp_extract('979|7.10.80|8684','(.*?)\\|.*',1) from a2data.test limit 1;    
OK    
979   
贪婪匹配和非贪婪匹配的区别 .* 和 .*?

如果可以确定取以竖线分割的第N字段,用split即可,比如,取第二个字段7.10.80:

Sql代码  

select split('979|7.10.80|8684','\\|')[1] from a2data.test limit 1;    
OK    
7.10.80   


hive正则表达式详解

hive中的正则表达式还是很强大的。数据工作者平时也离不开正则表达式。对此,特意做了个hive正则表达式的小结。所有代码都经过亲测,正常运行。




1.regexp

语法: A REGEXP B 操作类型: strings

描述: 功能与RLIKE相同


[code]select count(*) from a2data.test where create_date_wid not regexp '\\d{8}'
与下面查询的效果是等效的:

[code]select count(*) from a2data.test where create_date_wid not rlike '\\d{8}';


2.regexp_extract

语法: regexp_extract(string subject, string pattern, int index)


返回值: string

说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。

[code]hive> select regexp_extract('IloveYou','I(.*?)(You)',1) from tesa2data.test limit 1;
Total jobs = 1
...
Total MapReduce CPU Time Spent: 7 seconds 340 msec
OK
love
Time taken: 28.067 seconds, Fetched: 1 row(s)
[code]hive> select regexp_extract('IloveYou','I(.*?)(You)',2) from tesa2data.test limit 1;
Total jobs = 1
...
OK
You
Time taken: 26.067 seconds, Fetched: 1 row(s)



[code]hive> select regexp_extract('IloveYou','(I)(.*?)(You)',1) from tesa2data.test limit 1;
Total jobs = 1
...
OK
I
Time taken: 26.057 seconds, Fetched: 1 row(s)
[code]hive> select regexp_extract('IloveYou','(I)(.*?)(You)',0) from tesa2data.test limit 1;
Total jobs = 1
...
OK
IloveYou
Time taken: 28.06 seconds, Fetched: 1 row(s)



[code]hive> select regexp_replace("IloveYou","You","") from tesa2data.test limit 1;
Total jobs = 1
...
OK
Ilove
Time taken: 26.063 seconds, Fetched: 1 row(s)


3.regexp_replace

语法: regexp_replace(string A, string B, string C)


返回值: string

说明:将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。



[code]hive> select regexp_replace("IloveYou","You","") from tesa2data.test limit 1;
Total jobs = 1
...
OK
Ilove
Time taken: 26.063 seconds, Fetched: 1 row(s)
[code]hive> select regexp_replace("IloveYou","You","a2data") from tesa2data.test limit 1;
Total jobs = 1
...
OK
Ilovea2data
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档