在 Hive 中使用字符串比较和正则表达式时的不同结果
Different results when using string comparison and regexp in Hive
我有一个 Hive table,它有一个字符串格式的日期字段,如下所示
"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-\d{2}.*';
--> gives 115038
关于为什么会发生这种情况的任何线索?
解决方法很简单:除非参数是字符串,否则不要使用字符串函数。您正在尝试对日期使用字符串函数,因此 mdate
需要转换为字符串。这是一个隐式转换,因此它使用当时正在使用的系统上设置的任何系统默认值。在许多数据库中,它也会对性能产生很大影响。
通常,如果您希望所有日期都在 5 月,您会使用:
SELECT COUNT(*)
FROM table
WHERE mdate >= '2013-05-01' AND mdate < '2013-06-01';
即使 mdate
具有时间分量,这仍然有效。
我同意@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 和比较(正则表达式通常很昂贵,并且转换到日期也可以)。
select substr("2013-05-31 00:00:00.0",1,10) <= '2013-05-31' ;
我有一个 Hive table,它有一个字符串格式的日期字段,如下所示
"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-\d{2}.*';
--> gives 115038
关于为什么会发生这种情况的任何线索?
解决方法很简单:除非参数是字符串,否则不要使用字符串函数。您正在尝试对日期使用字符串函数,因此 mdate
需要转换为字符串。这是一个隐式转换,因此它使用当时正在使用的系统上设置的任何系统默认值。在许多数据库中,它也会对性能产生很大影响。
通常,如果您希望所有日期都在 5 月,您会使用:
SELECT COUNT(*)
FROM table
WHERE mdate >= '2013-05-01' AND mdate < '2013-06-01';
即使 mdate
具有时间分量,这仍然有效。
我同意@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 和比较(正则表达式通常很昂贵,并且转换到日期也可以)。
select substr("2013-05-31 00:00:00.0",1,10) <= '2013-05-31' ;