在 Hive 中使用字符串比较和正则表达式时的不同结果

Posted

技术标签:

【中文标题】在 Hive 中使用字符串比较和正则表达式时的不同结果【英文标题】:Different results when using string comparison and regexp in Hive 【发布时间】:2018-09-20 10:24:57 【问题描述】:

我有一个 Hive 表,其中包含如下字符串格式的日期字段

"2013-05-01 00:10:41.0"

我在以下查询之间得到不一致的结果:

SELECT COUNT(*)
FROM table
WHERE mdate >= '2013-05-01' AND mdate <= '2013-05-31';

--> gives 111930


SELECT COUNT(*)
FROM table
WHERE mdate regexp '^2013-05-\\d2.*';

--> gives 115038

关于为什么会发生这种情况的任何线索?

【问题讨论】:

【参考方案1】:

我同意@Gordon 的建议,但是它没有回答问题,在这种情况下没有隐式转换,您正在比较 2 个字符串。您在第一次比较中获得的值较少,因为您释放了所有 -31 值。你可以运行它来检查..

select "2013-05-31 00:00:00.0" &lt;= '2013-05-31' ; -- 错误

select "2013-05-30 00:00:00.0" &lt;= '2013-05-31' ; -- 是的

这是因为您正在进行字典比较...实际上'2013-05-31' 小于"2013-05-31 00:00:00.0"

如果我想以更便宜的方式执行此比较,我会说它是 substr 和 compare(正则表达式通常很昂贵,并且到目前为止也可以)。

select substr("2013-05-31 00:00:00.0",1,10) <= '2013-05-31' ;

【讨论】:

【参考方案2】:

解决方案很简单:除非参数是字符串,否则不要使用字符串函数。您正在尝试在日期上使用字符串函数,因此需要将 mdate 转换为字符串。这是一种隐式转换,因此它使用当时正在使用的系统上设置的任何系统默认值。在许多数据库中,它也会对性能产生很大影响。

通常,如果您想要 5 月期间的所有日期,您会使用:

SELECT COUNT(*)
FROM table
WHERE mdate >= '2013-05-01' AND mdate < '2013-06-01';

即使mdate 有时间组件,这也有效。

【讨论】:

感谢您的回复。我不确定我是否理解您的回答。 mdate 字段已经是字符串格式(不是日期也不是时间戳),因此不应发生转换 @revy 。 . .您应该使用适当的数据类型存储日期/时间。如果它是一个字符串,你可能仍然会发现它有效。

以上是关于在 Hive 中使用字符串比较和正则表达式时的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

Hive 和 Impala 之间的正则表达式的语法是不是不同?

python中正则表达式在中文字符串匹配时的坑

hive 正则匹配符号都要转义吗

hive正则表达式

Hive中常用正则表达式的运用

Hive 正则表达式