2014-12-05 71 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