Hive 从Pig保存到配置单元表的问题

Hive 从Pig保存到配置单元表的问题,hive,apache-pig,alias,hcatalog,Hive,Apache Pig,Alias,Hcatalog,我正在使用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.apach

我正在使用
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_id                  int                     
name                    string                  
addr_id                 int                     
address                 string    
cmr\u地址\u加入

addr_id                 int                     
cmr_id                  int                     
address                 string                  
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生成的文件名与配置单元列匹配,但并不完全匹配(
A::cmr\u id与cmr\u id
)。我认为
HCatalogStorer
希望别名是
cmr\u id
,而不是
A::cmr\u 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、$1等来访问这些列,并请将它们重命名为列名,例如:$0作为cmr_id

是的,在这一点上没有乐趣,但您似乎不太可能获得准确的解决方案,尤其是因为您的连接返回关系中包含两个连接键(例如-A::cmr\u id和B::cmr\u id)。你已经找到了唯一真正的解决办法;使用FOREACH/GENERATE适当地投影它,并重命名列名。实际上,对于真正的配置单元结构,您可能无论如何都必须这样做,因为您不仅必须正确命名列,而且必须按照正确的顺序命名列。更不用说,“真实”配置单元表不太可能将连接键的值存储两次


我能想到的唯一其他解决方案(我不推荐)是将C作为文件存储在HDFS上,您有一个非托管(可能是外部)配置单元表,该表配置为指向您刚刚将文件存储到的目录。您还可以预先创建一个配置单元视图,其中包含序列,可能会修剪额外的列(如重复的cmr_id),这样您就可以使用HCatLoader执行新的加载命令,然后将该别名用于HCatStorer STORE命令。这在Pig脚本中看起来可能更好,但您仍然需要完成大部分工作(仅在配置单元中),并且肯定会对性能产生影响,因为在将C表示的HDFS文件保存到所需的配置单元表之前,您必须先编写,然后再读取它。

请参阅此问题以了解解决方案。