Улей: добавление динамических разделов во внешнюю таблицу
Я запускаю куст 071, обрабатывая существующие данные, которые имеют следующий макет каталога:
-TableName
- d = (например, 2011-08-01)
- d = 2011-08-02
- d = 2011-08-03
... и т.д.
под каждой датой у меня есть файлы даты.
теперь для загрузки данных, которые я использую
CREATE EXTERNAL TABLE table_name (i int)
PARTITIONED BY (date String)
LOCATION '${hiveconf:basepath}/TableName';**
Я хочу, чтобы мой куст script мог загружать соответствующие разделы в соответствии с некоторой датой ввода и количеством дней. поэтому, если я передаю date = '2011-08-03' и days = '7'
script должен загружать следующие разделы
- d = 2011-08-03
- d = 2011-08-04
- d = 2011-08-05
- d = 2011-08-06
- d = 2011-08-07
- d = 2011-08-08
- d = 2011-08-09
Я не нашел какой-либо дискретный способ сделать это, кроме явного запуска:
ALTER TABLE table_name ADD PARTITION (d='2011-08-03');
ALTER TABLE table_name ADD PARTITION (d='2011-08-04');
ALTER TABLE table_name ADD PARTITION (d='2011-08-05');
ALTER TABLE table_name ADD PARTITION (d='2011-08-06');
ALTER TABLE table_name ADD PARTITION (d='2011-08-07');
ALTER TABLE table_name ADD PARTITION (d='2011-08-08');
ALTER TABLE table_name ADD PARTITION (d='2011-08-09');
а затем запустив мой запрос
select count(1) from table_name;
однако это отключение не автоматизировано в соответствии с вводом даты и дней
Можно ли каким-либо образом определить внешнюю таблицу для загрузки разделов в соответствии с диапазоном дат или арифметикой даты?
Ответы
Ответ 1
У меня очень похожая проблема, когда после миграции мне нужно воссоздать таблицу, для которой у меня есть данные, но не метаданные. Похоже, что это решение после воссоздания таблицы:
Таблица MSCK REPAIR table_name;
Разъяснение здесь
В этом также упоминается "alter table X recover partitions"
, который OP прокомментировал на своем собственном посту. MSCK REPAIR TABLE table_name;
работает над реализациями, отличными от Amazon-EMR (Cloudera в моем случае).
Ответ 2
Разделы - это физическая сегментация данных - где раздел поддерживается системой каталогов, а запросы используют метаданные, чтобы определить, где находится раздел. поэтому, если вы можете заставить структуру каталогов соответствовать запросу, он должен найти нужные вам данные. например:
select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09');
но я не знаю никаких операций с диапазоном дат, в противном случае вам нужно будет сделать математику для создания шаблона запроса.
вы также можете создавать внешние таблицы и добавлять к ним разделы, определяющие местоположение.
Это позволяет вам обрезать данные по своему усмотрению и по-прежнему использовать схему разделов для оптимизации запросов.
Ответ 3
Я не верю, что в Hive есть встроенные функции. Возможно, вы сможете написать плагин. Создание пользовательских UDF
Вероятно, не нужно упоминать об этом, но рассмотрели ли вы простой bash script, который будет принимать ваши параметры и передавать команды на улей?
Рабочие процессы Oozie будут другим вариантом, однако это может быть излишним. Расширение Oozie Hive - После некоторого размышления я не думаю, что Оози будет работать на это.
Ответ 4
Я объяснил подобный сценарий в своем сообщении в блоге:
1) Вам нужно установить свойства:
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
2) Создайте внешнюю промежуточную таблицу для загрузки данных входных файлов в эту таблицу.
3) Создайте основную производственную внешнюю таблицу "production_order" с полем даты в качестве одного из разделенных столбцов.
4) Загрузите производственную таблицу из промежуточной таблицы, чтобы данные были распределены в разделах автоматически.
Объяснить аналогичную концепцию в следующем блоге. Если вы хотите увидеть код.
http://exploredatascience.blogspot.in/2014/06/dynamic-partitioning-with-hive.html