Внешний стол в улье - расположение

Приведенная ниже таблица не возвращает данных при выполнении оператора выбора.

CREATE EXTERNAL TABLE foo (
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\073'
LINES TERMINATED BY '\n'
LOCATION '/user/data/CSV/2016/1/27/*/part-*';

Мне нужно, чтобы мой улей указывал на динамическую папку, так как задание mapreduce помещает файл детали в папку и загружает куст в таблицу.

Есть ли способ сделать местоположение динамическим, например

/user/data/CSV/*/*/*/*/part-*

или просто /user/data/CSV/* подойдет?

(Тот же код отлично работает, когда создается как внутренняя таблица и загружается с путем к файлу - следовательно, нет проблем из-за форматирования)


person Arvind Ravichandran    schedule 27.01.2016    source источник


Ответы (4)


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

Если у вас есть данные, которые сгенерированы, например ежедневно с помощью какого-либо внешнего процесса вам следует подумать о разбиении таблицы по дате. Затем вам нужно добавить новый раздел в таблицу, когда данные станут доступны.

person LiMuBei    schedule 27.01.2016
comment
Я не упомянул здесь столбцы таблицы - возможно ли, что Hive может получить доступ к нескольким папкам без разделения? - person Arvind Ravichandran; 27.01.2016
comment
Без понятия. Тебе нужно попробовать. - person LiMuBei; 28.01.2016
comment
Спасибо, LiMuBei - я только что разобрался с этим, как упоминалось выше ... приветствовал бы любые другие методы, с помощью которых это можно улучшить - person Arvind Ravichandran; 03.02.2016

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

hadoop fs -cat /user/data/CSV/*/*/*/*/part-* | hadoop fs -put - <destination folder>
person Arvind Ravichandran    schedule 03.02.2016

Эта линия

     LOCATION '/user/data/CSV/2016/1/27/*/part-*';

Не выглядит правильным, я не думаю, что таблица может быть создана из нескольких мест. Вы пробовали просто импортировать по одному месту, чтобы подтвердить это?

Также может быть, что вы используете неправильный разделитель. Если вы используете файл CSV для импорта данных, попробуйте разделить их знаком «,».

person DPEZ    schedule 03.02.2016

Вы можете использовать оператор alter table для изменения местоположений. В приведенном ниже примере разделы основаны на датах, когда данные хранятся в местах файлов, зависящих от времени. Если я хочу искать много дней, мне нужно добавить оператор alter table для каждого местоположения. Эта идея может неплохо распространиться на вашу ситуацию. Вы создаете сценарий для генерации оператора create table, как показано ниже, с использованием другой технологии, такой как python.

 CREATE EXTERNAL TABLE foo (
 )
 ROW FORMAT DELIMITED
 FIELDS TERMINATED BY '\073'
 LINES TERMINATED BY '\n'
 ;
 alter table foo add partition (date='20160201') location /user/data/CSV/20160201/data;
 alter table foo add partition (date='20160202') location /user/data/CSV/20160202/data;
 alter table foo add partition (date='20160203') location /user/data/CSV/20160203/data;
 alter table foo add partition (date='20160204') location /user/data/CSV/20160204/data;

Вы можете использовать столько операторов добавления и удаления, сколько вам нужно, чтобы определить свои местоположения. Тогда ваша таблица может найти данные, хранящиеся во многих местах в HDFS, а не хранить все ваши файлы в одном месте.

Вы также можете использовать

create table like

утверждение. Чтобы создать схему, как в другой таблице. Затем измените таблицу так, чтобы она указывала на нужные файлы.

Я знаю, что это не совсем то, что вам нужно, и это скорее работа. Удачи!

person invoketheshell    schedule 03.02.2016
comment
Спасибо, invoketheshell., Я опробую вашу идею. В настоящее время я запускаю автоматизированный скрипт, который получает файлы из этой папки (дата +% Y /% m /% d) и помещает их в отдельную папку с точками улья. - - person Arvind Ravichandran; 04.02.2016