2014-12-05 39 views
3

我使用HCatalog讀取和寫入數據,從豬腳本蜂巢如下攆表:問題保存到豬

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 2016-11-11 00:15:54

回答

1

您可以使用$ 0,$ 1等接入列,請做他們重命名爲列名,例如:$ 0作爲cmr_id

1

是的,在這一個沒有快樂,但它似乎不太可能,你會有確切的解決方案,特別是因爲你的連接返回關係將有他們的兩個連接鍵(例如 - A :: cmr_id和B :: cmr_id)。你已經遇到了唯一真正的解決方案;使用FOREACH/GENERATE進行適當的項目並重命名列名稱。在實踐中,無論如何,您可能必須爲真正的Hive結構執行此操作,因爲您必須使列不僅僅是正確命名,而是按正確的順序。更不用說,「真正的」Hive表不太可能將連接鍵的值存儲兩次。

我能想到的唯一的其他解決方案(我不推薦)將STORE C作爲HDFS上的文件,將非託管(可能是EXTERNAL)Hive表配置爲指向您的目錄只是將文件存儲到。您還可以使用Hive視圖預先創建序列,可能會裁剪額外的列(如重複的cmr_id),然後您可以使用HCatLoader執行新的LOAD命令,然後將該別名用於HCatStorer STORE命令。這在你的Pig腳本中看起來可能會更好,但是你仍然需要完成大部分工作(只在Hive中),並且肯定會對性能產生影響,因爲你必須編寫並讀取由C保存到所需的Hive表中。

+0

http://stackoverflow.com/questions/38902046/pig-how-to-刪除功能於該列名稱/ 40538122#40538122 – user584583 2016-11-11 00:15:33