请选择 进入手机版 | 继续访问电脑版

数仓工具—Hive语法之like rlike regexp (2)

[复制链接]
时间苍白了等待 发表于 2021-1-3 11:55:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
Hive 中的匹配

为什么我们说是Hive 中的匹配,没有说是Hive 中的正则匹配呢?因为这里的匹配除了正则的,尚有不是正则的,SQL 提供的简化版本的匹配那就是like ,特点纵然使用起来简单,固然功能也相对简单,所以相对正则来说照旧简单那么一丢丢的,在一些简单的场景下就可以使用,也正是体现了杀鸡焉用牛刀的优良传统。
like不是正则匹配。关于like可以看一下SQL的标准,比方%代表任意多个字符 _ 代表单个字符。rlike是正则,正则的写法与java一样。’‘需要使用’\’,比方’\w’需要使用’\w’
正则表达式是形貌搜索模式的特殊字符串。 它是一个强大的工具,为我们提供一种轻便机动的方法来识别基于模式的文本字符,比方字符,单词等。比方,我们可以使用正则表达式来搜索电子邮件,IP所在,电话号码,社会安全号码或具有特定模式的任何内容。正则表达式可以由正则表达式处置处罚器表明的自己的语法,正则表达式广泛应用于从编程语言数据库(包罗MySQL)大部门平台。使用正则表达式的优点是,不限于在like运算符中基于具有百分号(%)和下划线(_)的固定模式搜索字符串。 使用正则表达式,有更多的元字符来构造机动的模式。
1. like的使用详解

1.语法规则:

  • 格式是A like B,此中A是字符串,B是表达式,表现可否用B去完全匹配A的内容,换句话说可否用B这个表达式去表现A的全部内容,注意这个和rlike是有区别的。返回的效果是True/False
  • B只能使用简单匹配符号 _和%,_表现任意单个字符,字符”%”表现任意数量的字符
  • like的匹配是按字符逐一匹配的,使用B从A的第一个字符开始匹配,所以纵然有一个字符差别都不可。
2.利用范例: strings
3.使用形貌: 如果字符串A大概字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;否则为FALSE。尤其注意NULL值的匹配,返回的效果不是FALSE和TRUE,而是null,实在除了is null ,is not null,其他的关系运算符只要遇到null值出现,效果都是返回NULL,而不是TRUE/FALSE
  1. 0: jdbc:hive2://localhost:10000> select  'abcde'  like 'abc';OKfalse0: jdbc:hive2://localhost:10000> select  null   like '%';OKNULL0: jdbc:hive2://localhost:10000> select  'abc'   like null ;OKNULL
复制代码
4.案例演示
’foobar’ LIKE ‘foo’的值为FALSE,而’foobar’ LIKE 'foo___'的值为TRUE, ‘foobar’ LIKE 'foo%'的值为TRUE。要转义%,请使用(%匹配一个%字符)。如果数据包罗分号,你想匹配它,则需要转义,像’a;b’
  1. 0: jdbc:hive2://localhost:10000> select  'abcde'  like 'abc';false0: jdbc:hive2://localhost:10000> select  'abcde'  like 'abc__';true0: jdbc:hive2://localhost:10000> select  'abcde'  like 'abc%';true0: jdbc:hive2://localhost:10000>select  'abcde'  like '%abc%';true0: jdbc:hive2://localhost:10000> select  'abcde'  like 'bc%';false0: jdbc:hive2://localhost:10000> select  'abcde'  like '_bc%';true0: jdbc:hive2://localhost:10000> select  'abcde'  like '_b%';true
复制代码
这里我们再演示一下如何去匹配% 和 _ ,因为我们是要去匹配它,所以这两个字符都是出现在被匹配字符串里的,而不是规则串里,所以我们只需要将其当做平凡字符匹配
  1. 0: jdbc:hive2://localhost:10000> select  'ab%cde'  like 'ab_c%';trueselect  'ab%cde'  like 'ab%c%';true
复制代码
可以看到我们的% 和 _,在被匹配字符串里的时候就是一个平凡字符,已经失去了在规则串中的寄义,所以可以使用 % 和 _ 直接匹配,但是这里我们是将其当做字符举行匹配的,但是我们如何精准匹配呢,什么意思呢就是上面我们的规则串ab%c%
不止可以匹配’ab%cde’也可以匹配’abXcde’ 啊,这里你把X 缓存任意的都建立,也就是让我们的规则串中的% 失去原来的意义,只匹配它原来的寄义,也就是我们说的转移了,只需要前面添加一个\ 就可以了
  1. -- 没有转义0: jdbc:hive2://localhost:10000> select  'abXcde'  like 'ab%c%';true-- 转义0: jdbc:hive2://localhost:10000> select  'abXcde'  like 'ab\%c%';false-- 这下就到达我们的目的了0: jdbc:hive2://localhost:10000> select  'ab%cde'  like 'ab\%c%';true
复制代码
_ 的转义也是一样的,就不再在这里演示了
5.注意事项**:否定比力时候用NOT A LIKE B(使用A NOT LIIKE B也可以),效果与like的效果时相对的。null 到场的like 和 not like 返回值都是null
  1. 0: jdbc:hive2://localhost:10000> select 'abcde'  like 'abc';false0: jdbc:hive2://localhost:10000> select 'abcde' not like 'abc';true0: jdbc:hive2://localhost:10000> select 'abcde' not like 'abc';true0: jdbc:hive2://localhost:10000> select null like '%';NULL0: jdbc:hive2://localhost:10000> select not null like '%';NULL0: jdbc:hive2://localhost:10000> select null not  like '%';NULL0: jdbc:hive2://localhost:10000> select null like null;NULL0: jdbc:hive2://localhost:10000> select null not like null;NULL
复制代码
NULL 简直就是个bug 一般的存在,自己都不像自己,实在也可以明白因为其他值都是确定,而唯独NULL代表了一切不公道、不正确的效果(强行表明和加戏,估计导演不开心了)
2. RLIKE使用详解

1.语法规则:

  • A RLIKE B 表现的寄义和 A LIKE B不太 一样,A LIKE B 表现A 是否和B 的规则匹配的上,A RLIKE B 表现的是A 是否含有B, 关键字从Like 换成rlike 了所以寄义发生了一点厘革,R 是正则regular 的缩写
  • 因为关键字是rlike 了,所以B中的表达式可以使用JAVA中全部正则表达式,详细正则规则参考java,大概其他标准正则语法
2.利用范例: strings
3.使用形貌: 如果字符串A大概字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;否则为FALSE。
  1. 0: jdbc:hive2://localhost:10000> select 'footbar' rlike '^f..]+r$';false0: jdbc:hive2://localhost:10000> select 'footbar' rlike '^f.*r$';true--注意同样表达式,用正则匹配乐成(是否包罗)0: jdbc:hive2://localhost:10000> select 'foobar' rlike 'foo'; true--注意同样表达式,用like匹配失败(是否匹配得上)hive (default)> select 'foobar' like 'foo';false0: jdbc:hive2://localhost:10000> select '123456' rlike '^\\d+$';true0: jdbc:hive2://localhost:10000>  select null rlike '.*';NULL
复制代码
实在我们可以看到rlike 的匹配功能更增强大,比方可以匹配数字,匹配字母,但是like 只能表达一种语义,那就是是否匹配得上,但是与之而来的就是你得熟悉正则的表达方式
not A like B 与 A not like B


  • not like是like的否定用法,如果like匹配效果时true,则not like的匹配效果时false,反之也是效果也是相对。固然前提要清除出现null问题,null的效果都是null值。
  1. hive> select 1 from t_fin_demo  where NOT 'football' like 'fff%';hive>select 1 from t_fin_demo where 'football' not  like 'fff%';hive> select 1 from t_fin_demo where 'football'  like 'fff%';
复制代码
not A like B 与 A not like B 表达的寄义是一样的,不消纠结,选择自喜欢的风格用就可以,我就只会用 not like ,而不是 not xxx like bbb
4. regexp 和rlike

regexp 和 rlike 是一样的,语法是一样的,寄义也是一样的,不一样的就是名字了,regexp 看起来更像见名知意一些

总结


  • rlike 的匹配功能更增强大,比方可以匹配数字,匹配字母,但是like 不可,它只能表达一种语义,那就是是否匹配得上,
  • rlike 很强大但是与之而来的就是你得熟悉正则的表达方式,like 虽然功能简单,但是使用也简单,这就是为什么同时存在rlike 和 like 了
  • like是反面只支持简单表达式匹配(_%),而rlike则支持标准正则表达式语法。所以如果正则表达式使用熟练的话,发起使用rlike,功能更增强大。所有的like匹配都可以被替换成rlike。反之,则不可。但是注意:like是重新逐一字符匹配的,是全部匹配,但是rlike则不是,可以从任意部位匹配,而且不是全部匹配
  • NOT A LIKE B是LIKE的效果否定,如果like匹配效果时true,则not like的匹配效果时false,反之也是效果也是相对。实际中也可以使用 A NOT LIKE B,也是LIKE的否定,与 NOT A LIKE B一样。固然前提要清除出现null问题,null的效果岂论怎样利用都是null。
  • 同理NOT RLIKE 的使用,也是NOT A RLIKE B是对RLIKE的否定。对null 值的处置处罚和 like 以及 not like 一样
  • regexp 和rlike 是一样的,只不外名字不一样而已

来源:https://blog.csdn.net/king14bhhb/article/details/112058139
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )