Подтвердить что ты не робот

Улей: добавление динамических разделов во внешнюю таблицу

Я запускаю куст 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;

однако это отключение не автоматизировано в соответствии с вводом даты и дней

Можно ли каким-либо образом определить внешнюю таблицу для загрузки разделов в соответствии с диапазоном дат или арифметикой даты?

4b9b3361

Ответ 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