Я хотел бы иметь возможность добавлять несколько файлов 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: Это не работает; проверьте ниже]:
Код Talend производит для этого с помощью tHiveLoad фактически LOAD DATA INPATH ...
, который удалит файл от исходного местоположения в HDFS.
Вам нужно будет сделать более ранний синтаксис ALTER TABLE в tHiveLoad.
+1. Чтобы подробнее остановиться на этом ответе, местоположение, указанное для каждого нового раздела, динамически добавленное в секционированную внешнюю таблицу, фактически может быть произвольным путем к папке, содержащей файлы данных, - это не должен быть подкаталог местоположения, изначально определенного как «корень» внешней таблицы. – rchang
Эй Прадип. Не могли бы вы проверить мои изменения, чтобы проверить, правильно ли я получил DDL для определения таблицы? В частности, не включая местоположение в intitial DDL. С уважением –
Кажется, что все в порядке ... Я не уверен, что для DDL для таблицы требуется LOCATION или нет (я думал, что это так). Если это так, вы всегда можете просто положить его в фиктивное местоположение. –