#hadoop #hive #mapreduce #hiveql
#hadoop #улей #mapreduce #hiveql
Вопрос:
Моя таблица hive разделена на год, месяц, день, час
Теперь я хочу получить данные с 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;
Комментарии:
1. Не могли бы вы вставить образец данных, которые есть в вашей таблице hive?
2. @LalitAgarwal Я добавил структуру таблицы в вопросах. Спасибо, что указали на это.
Ответ №1:
Это аналогичный сценарий, с которым мы сталкиваемся каждый день при запросе таблиц в hive. Мы разделили наши таблицы аналогично тому, как вы объяснили, и это очень помогло при выполнении запросов. Вот как мы разделяем:
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
Надеюсь, это поможет
Комментарии:
1. Если OP может изменять разделы, я думаю, что лучшим подходом является использование
yy-mm-dd
string в качестве раздела. При этом вы можете использовать сложные SQL-запросы, см. Более подробную информацию community.hortonworks.com/questions/29031 /…
Ответ №2:
вы можете запросить следующим образом
WHERE st_date > '2014-05-27-00' and end_date < '2014-06-05-24'
должно дать вам желаемый результат, потому что, даже если это sting a, оно будет сравниваться лексикографически, т.е. ‘2014-04-04’ всегда будет больше ‘2014-04-03’.
Я запустил его в своих примерах таблиц, и он отлично работает.
Комментарии:
1. спасибо за ответ. год, месяц, день, час — это отдельные поля. Я добавил свою структуру таблицы, о которой идет речь.
Ответ №3:
Вы можете использовать CONCAT с LPAD.
Допустим, вы хотите получить все разделы между 2020-03-24, час = 00 до 2020-04-24, час = 23, тогда ваше условие «где» будет выглядеть следующим образом:
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')