Запросить секционированную таблицу куста по диапазону даты / времени

Моя таблица улья разделена на год, месяц, день, час

Теперь я хочу получить данные с 2014-05-27 по 2014-06-05 Как я могу это сделать??

Я знаю, что один из вариантов - создать раздел в эпоху (или гггг-мм-дд-чч) и во время прохождения запроса. Могу ли я сделать это без потери иерархии дат?

Структура таблицы

CREATE TABLE IF NOT EXISTS table1 (col1 int, col2 int)
PARTITIONED BY (year int, month int, day int, hour int) 
STORED AS TEXTFILE;

2 ответа

С подобным сценарием мы сталкиваемся каждый день, когда запрашиваем таблицы в улье. Мы разбили наши таблицы так же, как вы объяснили, и это сильно помогло при запросах. Вот как мы делим:

CREATE TABLE IF NOT EXISTS table1 (col1 int, col2 int)
PARTITIONED BY (year bigint, month bigint, day bigint, hour int) 
STORED AS TEXTFILE;

Для разделов мы присваиваем такие значения:

year = 2014, month = 201409, day = 20140924, hour = 01

Таким образом, запрос становится действительно простым, и вы можете напрямую запросить:

select * from table1 where day >= 20140527 and day < 20140605 

Надеюсь это поможет

Вы можете запросить, как это

  WHERE st_date > '2014-05-27-00' and end_date < '2014-06-05-24' 

должен дать желаемый результат, потому что, даже если это укус а, он будет сравниваться лексикографически, то есть "2014-04-04" будет всегда больше "2014-04-03".

Я запустил его на своих образцах таблиц, и он отлично работает.

Вы можете использовать CONCAT с LPAD.

Предположим, вы хотите получить все разделы между 2020-03-24, hour=00 до 2020-04-24, hour=23, тогда ваше условие 'where' будет выглядеть так:

WHERE (CONCAT(year, '-', LPAD(month,2,'0'), '-', LPAD(day,2,'0'), '_', LPAD(hour,2,'0')) > '2020-03-24_00')
AND (CONCAT(year, '-', LPAD(month,2,'0'), '-', LPAD(day,2,'0'), '_', LPAD(hour,2,'0')) < '2020-04-24_23')
Другие вопросы по тегам