Hive: добавление динамического раздела во внешнюю таблицу - PullRequest
17 голосов
/ 25 сентября 2011

Я использую куст 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';**  

Я бы хотел, чтобы мой скрипт улья мог загружать соответствующие разделы в соответствии с некоторой датой ввода и количеством дней. поэтому, если я пройду date = '2011-08-03' и days = '7'
Скрипт должен загрузить следующие разделы - д = 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;

однако, это вне курса не автоматизировано в соответствии с датой и днями ввода

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

Ответы [ 4 ]

7 голосов
/ 30 июля 2015

У меня очень похожая проблема, когда после миграции мне приходится заново создавать таблицу, для которой у меня есть данные, но не метаданные.Решение, как представляется, после воссоздания таблицы:

MSCK REPAIR TABLE table_name;

Объяснено здесь

Это такжеупоминает "alter table X recover partitions", что ОП прокомментировал свой пост.MSCK REPAIR TABLE table_name; работает с реализациями не-Amazon-EMR (в моем случае Cloudera).

0 голосов
/ 23 июня 2014

Я объяснил похожий сценарий в своем блоге:

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

0 голосов
/ 11 мая 2015

Я не верю, что для этого есть какие-то встроенные функции в Hive. Вы можете написать плагин. Создание пользовательских UDF

Вероятно, нет необходимости упоминать об этом, но вы рассматривали простой сценарий bash, который будет принимать ваши параметры и направлять команды в куст?

Рабочие процессы Oozie могут быть другим вариантом, однако это может быть излишним. Расширение Oozie Hive - Подумав, я не думаю, что Oozie подойдет для этого.

0 голосов
/ 16 февраля 2012

Разделы - это физическое сегментирование данных, где раздел поддерживается системой каталогов, а запросы используют метаданные, чтобы определить, где расположен раздел.так что, если вы можете сделать структуру каталогов соответствующей запросу, она должна найти нужные вам данные.например:

select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09');

, но я не знаю каких-либо операций с диапазоном дат, в противном случае вам придется сначала выполнить математику, чтобы создать шаблон запроса.внешние таблицы и добавьте в них разделы, которые определяют местоположение.Это позволяет вам уничтожать данные по своему усмотрению и по-прежнему использовать схему разбиения для оптимизации запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...