我正在使用HCatalog
从 Pig Script 向 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
当我运行它时,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();
但我的问题是,我有很多表,每个表都有数百列。如上所述指定别名会变得乏味。
任何解决此问题的帮助将不胜感激。