需求:
从字符串"979|7.10.80|8684"中提取最后一个竖线|后面的内容,
但是在这个字符串中,竖线的个数不是固定的 。
使用hive中的regexp_extract函数实现如下:
Sql代码
select regexp_extract('979|7.10.80|8684','.*\\|(.*)',1)from test limit1;
OK
8864
由于正则表达式的贪婪匹配,一直会匹配到最后一个竖线。
如果要取第一个竖线前面的内容,实现如下:
Sql代码
select regexp_extract('979|7.10.80|8684','(.*?)\\|.*',1)from test limit1;
OK
979
贪婪匹配和非贪婪匹配的区别 .* 和 .*?
如果可以确定取以竖线分割的第N字段,用split即可,比如,取第二个字段7.10.80:
Sql代码
select split('979|7.10.80|8684','\\|')[1]from test limit1;
OK
7.10.80
hive正则表达式详解
hive中的正则表达式还是很强大的。
数据工作者平时也离不开正则表达式。
regexp
语法: A REGEXP B 操作类型: strings
描述: 功能与RLIKE相同
[code]selectcount(*)from test where create_date_wid notregexp'\\d{8}'
与下面查询的效果是等效的:
[code]selectcount(*)from test where create_date_wid notrlike'\\d{8}';
regexp_extract
语法: regexp_extract(string subject, string pattern,intindex)
返回值: string
说明:将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。
[code]hive>select regexp_extract('IloveYou','I(.*?)(You)',1)from test limit1;
Total jobs =1...
Total MapReduce CPU Time Spent: 7 seconds 340 msec
OK
love
Time taken: 28.067 seconds, Fetched: 1row(s)[code]hive>select regexp_extract('IloveYou','I(.*?)(You)',2)from test limit1;
Total jobs =1...
OK
You
Time taken: 26.067 seconds, Fetched: 1row(s)[code]hive>select regexp_extract('IloveYou','(I)(.*?)(You)',1)from test limit1;
Total jobs =1...
OK
I
Time taken: 26.057 seconds, Fetched: 1row(s)[code]hive>select regexp_extract('IloveYou','(I)(.*?)(You)',0)from test limit1;
Total jobs =1...
OK
IloveYou
Time taken: 28.06 seconds, Fetched: 1row(s)[code]hive>select regexp_replace("IloveYou","You","")from test limit1;
Total jobs =1...
OK
Ilove
Time taken: 26.063 seconds, Fetched: 1row(s)
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 limit1;
Total jobs =1...
OK
Ilove
Time taken: 26.063 seconds, Fetched: 1row(s)[code]hive>select regexp_replace("IloveYou","You","a2data")from test limit1;
Total jobs =1...
OK
Ilovea2data