在 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" <= '2013-05-31' ;
-- 错误
select "2013-05-30 00:00:00.0" <= '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 中使用字符串比较和正则表达式时的不同结果的主要内容,如果未能解决你的问题,请参考以下文章