2014-12-05 4 views
3

Я использую HCatalog для чтения и записи данных в улей от Pig сценария следующим образом:Проблемы сохранения в Hive таблицу из Свиньи

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(); 

определения таблицы для клиента является:

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  

Когда я запускаю это, свинья выдает следующее сообщение об ошибке:

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1115: Column names should all be in lowercase. Invalid name found: A::cmr_id 

Я считаю, что это может быть потому, что свинья пытается соответствовать Свиньи сгенерированные имена файлов с колоннами улей это не совсем соответствует (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(); 

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

Любая помощь в устранении этого была бы весьма признательна.

+0

См. Этот вопрос для решения.http://stackoverflow.com/questions/38902046/pig-how-to-remove-in-the-column-name/40538122#40538122 – user584583

ответ

1

Вы можете использовать $ 0, $ 1 и так далее, чтобы доступ к столбцам и, пожалуйста, переименуйте их в качестве имени столбца, например: $ 0, как cmr_id

1

Да, никакой радости от этого, но это, кажется, маловероятно, что вы бы имеют такое точное решение, тем более, что ваше отношение, связанное с соединением, будет иметь оба ключа соединения в них (пример - A :: cmr_id и B :: cmr_id). Вы уже достигли единственного реального решения; спроектируйте его соответствующим образом с FOREACH/GENERATE и переименуйте имена столбцов. На практике вам, вероятно, придется делать это для реальных структур Hive, так как вам нужно будет иметь столбцы, которые не только правильно названы, но и в правильной последовательности. Не говоря уже о том, что вряд ли «реальная» таблица Hive будет иметь значение ключа соединения, которое хранится дважды.

Единственное другое решение, которое я могу придумать (и я не рекомендую), было бы для STORE C как файла на HDFS, у которого есть таблица управления Hive, не управляемая (вероятно, EXTERNAL), настроенная для указания на каталог, который вы просто сохранил файл. Вы также можете иметь представление Hive, которое предварительно создало эти последовательности, возможно, урезает дополнительные столбцы (например, дубликат cmr_id), столбцы, чтобы затем вы могли выполнить новую команду LOAD с помощью HCatLoader, а затем использовать этот псевдоним для команды HCATStorer STORE. Это может выглядеть лучше в вашем сценарии Pig, но вам все равно придется выполнять большую часть работы (только в Hive), и определенно будет иметь влияние производительности, так как вам придется писать, а затем читать, файл HDFS, представленный C, прежде чем сохранять его в желаемую таблицу Hive.

+0

http://stackoverflow.com/questions/38902046/pig-how-to- удалить-в-имя-столбца/40538122 # 40538122 – user584583

 Смежные вопросы

  • Нет связанных вопросов^_^