Я использую HCatalog
для чтения и записи данных в Hive из Pig Script следующим образом:
A = LOAD 'customer' USING org.apache.hcatalog.pig.HCatLoader();
B = LOAD 'address' USING org.apache.hcatalog.pig.HCatLoader();
C = JOIN A by cmr_id,B by cmr_id;
STORE C INTO 'cmr_address_join' USING org.apache.hcatalog.pig.HCatStorer();
Определение таблицы для customer:
cmr_id int
name string
Адрес:
addr_id int
cmr_id int
address string
cmr_address_join:
cmr_id int
name string
addr_id int
address string
Когда я запускаю это, Pig выдает следующую ошибку:
ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1115: Column names should all be in lowercase. Invalid name found: A::cmr_id
Я полагаю, что это может быть связано с тем, что Pig пытается сопоставить имена файлов, сгенерированных Pig, со столбцами Hive, и это не совсем соответствует (A::cmr_id versus cmr_id
). Я думаю, что HCatalogStorer
ожидает, что псевдоним будет cmr_id
, а не A::cmr_id
. Я бы хотел, чтобы HCatalogStorer
игнорировал префикс псевдонима и учитывал только имя поля.
grunt> DESCRIBE C;
C: {A::cmr_id: int,A::name: chararray,B::addr_id: int,B::cmr_id: int,B::address: chararray}
Есть ли способ убрать префикс поля в Pig (т.е. A::)? Или, если у кого-то есть обходной путь или решение, было бы здорово.
Я знаю, что мы можем использовать следующее, чтобы явно добавить псевдоним и заставить его работать.
D = foreach C generate A::cmr_id as cmr_id,A::name as name, B::addr_id as addr_id, B::address as address;
STORE D INTO 'cmr_address_join' USING org.apache.hcatalog.pig.HCatStorer();
Но моя проблема в том, что у меня много таблиц, каждая из которых имеет сотни столбцов. Было бы утомительно указывать псевдоним, как указано выше.
Любая помощь, чтобы исправить это, будет принята с благодарностью.