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

dzjeubhm  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(535)

我正在使用 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();

但我的问题是,我有很多表,每个表都有数百列。如上所述指定别名将变得乏味。
任何帮助解决这个将不胜感激。

58wvjzkj

58wvjzkj1#

您可以使用$0、$1等来访问这些列,并请将它们重命名为列名,例如:$0 as cmr\u id

pgky5nke

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表中。

相关问题