2016-12-29 9 views
1

Я хотел создать внешнюю таблицу и загрузить данные через скрипт свиньи. Я придерживался подхода ниже:Запись данных с использованием внешней таблицы PIG to HIVE


ОК. Создайте таблицу внешнего улья с компоновкой схемы где-нибудь в каталоге HDFS. Скажем,

create external table emp_records(id int, 
           name String, 
           city String) 
           row formatted delimited 
           fields terminated by '|' 
           location '/user/cloudera/outputfiles/usecase1'; 

Просто создайте таблицу, как указано выше, и не нужно загружать файлы в этот каталог.

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

A = LOAD 'inputfile.txt' USING PigStorage(',') AS(id:int,name:chararray,city:chararray); 
B = FILTER A by id > = 678933; 
C = FOREACH B GENERATE id,name,city; 
STORE C INTO '/user/cloudera/outputfiles/usecase1' USING PigStorage('|'); 

Убедитесь, что место назначения и разделитель и расположение схемы конечного FOREACH заявление в вас Pigscript соответствует схеме Hive DDL.


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

Есть ли способ избежать этой проблемы?

И есть ли какие-либо другие атрибуты, которые мы можем использовать с командой STORE в PIG для записи в конкретный файл/файл каждый раз?

Благодаря Ram

ответ

1

ДА вы можете использовать HCatalog для достижения результата.

помните, что вы должны запустить Pig сценарий как:

pig -useHCatalog your_pig_script.pig 

или если вы используете черновую оболочку затем просто использовать:

pig -useHCatalog 

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

STORE C INTO 'HIVE_DATABASE.EXTERNAL_TABLE_NAME' USING org.apache.hive.hcatalog.pig.HCatStorer();