尝试在 Hive 上查找数字不适用于类似查询

Posted

技术标签:

【中文标题】尝试在 Hive 上查找数字不适用于类似查询【英文标题】:Trying to find numerics on Hive doesn't work with like query 【发布时间】:2021-10-21 22:23:10 【问题描述】:

我尝试使用以下查询在field1 中查找具有数值的行

SELECT field1 WHERE field1 NOT LIKE '%[^0-9]%'

但是,这也会返回字母数字值,例如 3a3f3rdf3

我可以用这个查询做我想做的事情。

SELECT field1 WHERE field1 NOT RLIKE '[^0-9]'

这也有效:

SELECT field1 WHERE cast(field1 as double) is not null

但我仍然想了解为什么第一个不起作用,主要是我无法从查询中分辨出区别。

【问题讨论】:

【参考方案1】:

LIKE/NOT LIKE - 这是一个普通的字符串比较运算符。所以field1 NOT LIKE '%[^0-9]%' 不会给你正确的结果,因为它会寻找字符串[^0-9],而不是像寻找单个数字的正则表达式。参考下面的屏幕截图,我创建了一个包含各种不同数据的 tmp 表。当我们使用not like 时,您可以看到只有[^0-9] 被排除在外,一切都保留了下来。

RLIKE - 这是一个正则表达式字符串比较运算符。因此,您使用的语法(RLIKE '[^0-9]') 是一个正则表达式,它将正确显示没有所有数字的数据。 请参阅此链接以了解更多关于 rlike - https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/impala_operators.html#rlike

最后一个 SQL 将显示没有所有数字的数据,因为当该转换结果为 null 时,您正在转换和拾取。

【讨论】:

我不明白为什么 NOT LIKE 不起作用的解释。如果它在子字符串中查找 [^0-9](即任何非数字),它应该可以正常工作,这也是 RLIKE 查询所做的。 not like 不是正则表达式比较运算符,因此它会寻找精确的模式,而不像您期望的正则表达式。我对我的回答附加了更多解释。

以上是关于尝试在 Hive 上查找数字不适用于类似查询的主要内容,如果未能解决你的问题,请参考以下文章

解密不适用于在加密数据上使用解密值查询的记录

Python 错误:此方法仅适用于类,不适用于实例

使用_id查找不适用于聚合[重复]

使用_id查找不适用于聚合[重复]

Hive Exists 条件不适用于多种条件

在英文整数上显示每个数字的程序不适用于以“0”开头的整数