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 test limit 1;    
OK    
8864  
由于正则表达式的贪婪匹配,一直会匹配到最后一个竖线。
  • 如果要取第一个竖线前面的内容,实现如下:
Sql代码  
select regexp_extract('979|7.10.80|8684','(.*?)\\|.*',1) from test limit 1;    
OK    
979   
贪婪匹配和非贪婪匹配的区别 .*.*?

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

Sql代码  

select split('979|7.10.80|8684','\\|')[1] from test limit 1;    
OK    
7.10.80   
  • hive正则表达式详解
    hive中的正则表达式还是很强大的。
    数据工作者平时也离不开正则表达式。
  1. regexp
语法: A REGEXP B 操作类型: strings

描述: 功能与RLIKE相同


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

[code]select count(*) from test where create_date_wid not rlike '\\d{8}';
  1. regexp_extract
语法: regexp_extract(string subject, string pattern, int index)


返回值: string

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

[code]hive> select regexp_extract('IloveYou','I(.*?)(You)',1) from 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 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 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 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 test limit 1;
Total jobs = 1
...
OK
Ilove
Time taken: 26.063 seconds, Fetched: 1 row(s)
  1. 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 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 test limit 1;
Total jobs = 1
...
OK
Ilovea2data
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值