Различные результаты при использовании сравнения строк и регулярных выражений в Hive - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть таблица Hive с полем даты в формате String, подобным следующемуэто происходит?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я согласен с предложением @Gordon, однако он не отвечает на вопрос, и в этом случае неявное преобразование отсутствует, вы сравниваете 2 строки.Вы получаете меньше значений в первом сравнении, потому что вы выпускаете все значения -31.Вы можете запустить это, чтобы проверить ..

select "2013-05-31 00:00:00.0" <= '2013-05-31' ; - false

select "2013-05-30 00:00:00.0" <= '2013-05-31' ; - true

Это потому, что вы проводите лексикографическое сравнение ...и на самом деле '2013-05-31' меньше, чем "2013-05-31 00:00:00.0"

Если бы я предположил о менее дорогостоящем способе выполнения этого сравнения, я бы сказал, что это подстрок и сравнение (регулярные выражения обычно дороги и приводятся на сегодняшний день).быть так же).

select substr("2013-05-31 00:00:00.0",1,10) <= '2013-05-31' ;
0 голосов
/ 20 сентября 2018

Решение простое: не используйте строковые функции, если аргумент не является строкой.Вы пытаетесь использовать строковые функции для дат, поэтому mdate необходимо преобразовать в строку.Это неявное преобразование, поэтому оно использует любые системные значения по умолчанию, установленные в используемой системе в это время.Во многих базах данных это также может оказать большое влияние на производительность.

Обычно, если вы хотите, чтобы все даты были в мае, вы должны использовать:

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

Это работает, даже если mdate имеетвременная составляющая.

...