2015-02-07 3 views
3

Я хотел бы иметь возможность добавлять несколько файлов HDFS в одну таблицу Hive, оставляя файлы HDFS в их исходном каталоге. Эти файлы создаются в разных каталогах.Как указать одну таблицу улья на несколько внешних файлов?

LOAD DATA INPATH перемещает файл HDFS в каталог хранилища улья.

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

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

Расширенное решение от ответа Прадипом в:

Например, мои файлы выглядеть следующим образом:

/root_directory/<job_id>/input/<dt> 

Притворись схема каждой из них (Foo STRING, бар STRING, job_id STRING, дт STRING)

Сначала создаю внешний стол. Тем не менее, обратите внимание, что мой DDL не содержит начальное положение, и она не включает в себя job_id и дт поля:

CREATE EXTERNAL TABLE hivetest (
foo STRING, 
bar STRING 
) PARTITIONED BY (job_id STRING, dt STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
; 

Скажем, у меня есть два файла, я хочу добавить расположенный по адресу:

/root_directory/b1/input/2014-01-01 
/root_directory/b2/input/2014-01-02 

я могу загрузить эти два внешних файлов в тот же улей стол, как так:

ALTER TABLE hivetest 
ADD PARTITION(job_id = 'b1', dt='2014-01-01') 
LOCATION '/root_directory/b1/input/2014-01-01'; 

ALTER TABLE hivetest 
ADD PARTITION(job_id = 'b2', dt='2014-01-02') 
LOCATION '/root_directory/b2/input/2014-01-02'; 

Если кто-нибудь случается, требует использования Talend для выполнения этого они могут использовать компонент tHiveLoad как поэтому [edit: Это не работает; проверьте ниже]:

Matthew Moisen Hive Talend Insert

Код Talend производит для этого с помощью tHiveLoad фактически LOAD DATA INPATH ..., который удалит файл от исходного местоположения в HDFS.

Вам нужно будет сделать более ранний синтаксис ALTER TABLE в tHiveLoad.

ответ

6

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

E.g. Мы используем случай, когда внешняя таблица указывает на тысячи каталогов на HDFS. Наши пути соответствуют этому образцу /prod/${customer-id}/${date}/. В каждом из этих каталогов имеется около 100 файлов. При сопоставлении этого с таблицей Hive мы создали два столбца раздела: customer_id и date.Таким образом, каждый день, мы можем загрузить данные в улье, делая

ALTER TABLE x ADD PARTITION (customer_id = "blah", dt = "blah_date") LOCATION '/prod/blah/blah_date'; 
+2

+1. Чтобы подробнее остановиться на этом ответе, местоположение, указанное для каждого нового раздела, динамически добавленное в секционированную внешнюю таблицу, фактически может быть произвольным путем к папке, содержащей файлы данных, - это не должен быть подкаталог местоположения, изначально определенного как «корень» внешней таблицы. – rchang

+0

Эй Прадип. Не могли бы вы проверить мои изменения, чтобы проверить, правильно ли я получил DDL для определения таблицы? В частности, не включая местоположение в intitial DDL. С уважением –

+0

Кажется, что все в порядке ... Я не уверен, что для DDL для таблицы требуется LOCATION или нет (я думал, что это так). Если это так, вы всегда можете просто положить его в фиктивное местоположение. –

0

Попробуйте это:

LOAD DATA LOCAL INPATH '/path/local/file_1' INTO TABLE tablename; 

LOAD DATA LOCAL INPATH '/path/local/file_2' INTO TABLE tablename; 
Смежные вопросы