我正在使用 HCatalog
要从pig脚本向配置单元读写数据,请执行以下操作:
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\地址\加入:
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_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();
但我的问题是,我有很多表,每个表都有数百列。如上所述指定别名将变得乏味。
任何帮助解决这个将不胜感激。
2条答案
按热度按时间58wvjzkj1#
您可以使用$0、$1等来访问这些列,并请将它们重命名为列名,例如:$0 as cmr\u id
pgky5nke2#
是的,在这一点上没有乐趣,但是看起来您不太可能有那个精确的解决方案,特别是因为您的join返回关系将在其中包含两个join键(例如-a::cmr\u id和b::cmr\u id)。你已经找到了唯一真正的解决办法;使用foreach/generate适当地投影它并重命名列名。实际上,您可能必须对实际的配置单元结构执行此操作,因为您不仅必须正确命名列,而且还必须按照正确的顺序命名列。更不用说一个“真正的”配置单元表不太可能将连接键的值存储两次。
我能想到的唯一其他解决方案(我不推荐)是将c作为一个文件存储在hdfs上,该hdfs配置了一个非托管(可能是外部的)配置单元表,指向刚刚将文件存储到的目录。您还可以预先创建一个配置单元视图,其中包含序列,可能会修剪额外的列(如复制的cmr\u id),这些列,这样您就可以使用hcatloader执行新的加载命令,然后将该别名用于hcatstorer store命令。这在pig脚本中看起来更好,但是您仍然需要完成大部分工作(仅在hive中),并且肯定会对性能产生影响,因为您必须先编写然后读取由c表示的hdfs文件,然后再将其保存到所需的hive表中。