Hive: фильтрация данных между указанными датами в строковом формате. Какой из них оптимизирован и почему? - PullRequest
0 голосов
/ 13 апреля 2020

Какой из них следует предпочитать и почему? My_date_column имеет тип string и имеет формат YYYY-MM-DD

SELECT *
  FROM my_table
  WHERE my_date_column >= '2019-08-31' AND your_date_column <= '2019-09-02';

ИЛИ

SELECT *
  FROM my_table
  WHERE my_date_column in ('2019-08-31','2019-09-01','2019-09-02') ;

Наконец, в общем случае следует ли мне сохранять дату как тип данных Date или просто как строка? Я выбрал тип строки просто для обработки любых поврежденных / плохо отформатированных данных.

1 Ответ

0 голосов
/ 13 апреля 2020

Всегда храните даты как date тип. Если вы храните их как строки, это добавляет накладные расходы для выполнения любых арифметических операций c со значениями (включая эти неравенства).

Если вы решили проигнорировать этот совет и в любом случае сохранить даты как string, то я считаю, что вторая форма (список IN) будет быстрее, поскольку она сравнивает текстовую строку с текстовой строкой. Другой вариант, использующий неравенства, может не дать ожидаемых результатов, если вы явно не указали CAST(my_date_column as date) и CAST(your_date_column as date). Эти приведения будут применяться к каждой записи, что увеличивает общую стоимость запроса, и их можно было бы избежать, если бы эти столбцы хранились как date.

Третий вариант, который вы не упомянули, это использовать оператор BETWEEN (ie. WHERE my_date BETWEEN start_date AND end_date). Это то же самое, что и использование двух неравенств, но, возможно, немного чище и более идиоматически c.

В случае сомнений взгляните на планы EXPLAIN, чтобы понять, как будет выполняться запрос.

...