Как я могу разбить таблицу с помощью HIVE? - PullRequest
6 голосов
/ 09 марта 2012

Я играю с Hive уже несколько дней, но мне все еще тяжело с разделом.

Я записываю логи Apache (формат Combine) в Hadoop в течение нескольких месяцев. Они хранятся в текстовом формате строки, разделены по дате (через поток): / Журналы / гггг / мм / дд / чч / ** * 1003

Пример:

/logs/2012/02/10/00/Part01xx (02/10/2012 12:00 am)
/logs/2012/02/10/00/Part02xx
/logs/2012/02/10/13/Part0xxx (02/10/2012 01:00 pm)

Дата в файле объединенного журнала соответствует следующему формату [10 / февраль / 2012: 00: 00: 00 -0800]

Как мне создать внешнюю таблицу с разделом в Hive, использующую мой физический раздел. Я не могу найти хорошую документацию по разделу Hive. Я нашел связанный вопрос, такой как:

Если я загружаю свои журналы во внешнюю таблицу с помощью Hive, я не могу разделить по времени, поскольку это не очень хороший формат (февраль <=> 02). Даже если бы он был в хорошем формате, как мне преобразовать строку "10/02/2012: 00: 00: 00 -0800" в несколько каталогов "/ 2012/02/10/00"?

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

1 Ответ

5 голосов
/ 09 марта 2012

Если я правильно понимаю, у вас есть файлы в папках на 4 уровне глубины из журналов каталогов. В этом случае вы определяете свою таблицу как внешнюю с путем 'logs' и разделенную на 4 виртуальных поля: год, месяц, day_of_month, hour_of_day.

Разбиение по сути сделано для вас Flume.

РЕДАКТИРОВАТЬ 3/9: Многое зависит от того, как точно Flume записывает файлы. Но в общих чертах ваш DDL должен выглядеть примерно так:

CREATE TABLE table_name(fields...)
PARTITIONED BY(log_year STRING, log_month STRING, 
    log_day_of_month STRING, log_hour_of_day STRING)
format description
STORED AS TEXTFILE
LOCATION '/your user path/logs';

РЕДАКТИРОВАТЬ 3/15: По запросу zzarbi я добавляю примечание о том, что после создания таблицы Hive необходимо сообщить о созданных разделах. Это нужно делать многократно, пока Flume или другой процесс создает новые разделы. См. Мой ответ на Создание внешнего с разделом вопрос.

...