Pig:使用 AvroStorage 加载会引发“无法从 loadFunc 获取架构”异常

Posted

技术标签:

【中文标题】Pig:使用 AvroStorage 加载会引发“无法从 loadFunc 获取架构”异常【英文标题】:Pig: Load using AvroStorage throws "Cannot get schema from loadFunc" exception 【发布时间】:2015-10-05 19:48:55 【问题描述】:

在 hadoop 中,我们得到了存储在 '/datasets/xyz/storm/information/' 下的 avro 文件列表。

 -rw-r-----   3 storm XYZ    5570959 2015-10-01 01:46 /datasets/xyz/storm/information/storm_1443681972122.avro
 -rw-r-----   3 storm XYZ    5571687 2015-10-01 01:46 /datasets/xyz/storm/information/storm_1443681973303.avro
 -rw-r-----   3 storm XYZ    5632194 2015-10-01 01:46 /datasets/xyz/storm/information/storm_1443681975019.avro

什么有效?:

a= LOAD '/datasets/xyz/storm/information/storm_1443681975019.avro' USING AvroStorage ();  

Avro Schema 在每个 avro 文件中定义为以下格式的第一条记录:

 header: (metadata_uuid: chararray,publishDate: chararray,eventDate: chararray),raw_data: chararray

我想一次将所有 avro 文件数据加载到别名“a”中。所以,我尝试了以下代码:

a= = LOAD '/datasets/xyz/storm/information/' using AvroStorage();

我得到如下异常:

ERROR 2245: Cannot get schema from loadFunc org.apache.pig.builtin.AvroStorage

我还尝试如下明确提供架构:

 a= LOAD '/datasets/xyz/storm/information/' USING AvroStorage ('schema','"header": ("metadata_uuid": "chararray","publishDate": "chararray","eventDate": "chararray"),"raw_data": "chararray"');

你能告诉我正确的方法吗?

谢谢!

【问题讨论】:

在这里找不到有用的回复:***.com/questions/21588911/… 你可以试试:A = LOAD '/datasets/xyz/storm/information/*.avro' USING org.apache.pig.piggybank.storage.avro.AvroStorage(); @Murali Rao:感谢您的回复。得到同样的错误 【参考方案1】:

提供的架构不正确,格式也不正确。我从 AvroStorage 参数中删除了“模式”。 我修改了脚本如下:

a= LOAD '/datasets/xyz/storm/information/' USING AvroStorage('"type" : "record","name" : "DataRecord","namespace" : "com.bestbuy.sim.appTalkProjects.adobe.adobeClickStreamBDPSA.util","doc" : "Schema for com.bestbuy.sim.appTalkProjects.adobe.adobeClickStreamBDPSA.util.DataRecord","fields" : [ "name" : "header","type" : [ "null", "type" : "record","name" : "Header","doc" : "Schema for com.bestbuy.sim.appTalkProjects.adobe.adobeClickStreamBDPSA.util.Header","fields" : [ "name" : "metadata_uuid","type" : [ "null", "string" ], "name" : "publishDate","type" : [ "null", "string" ], "name" : "eventDate","type" : [ "null", "string" ] ] ], "name" : "raw_data","type" : [ "null", "string" ] ]');

这使得加载成功。

【讨论】:

以上是关于Pig:使用 AvroStorage 加载会引发“无法从 loadFunc 获取架构”异常的主要内容,如果未能解决你的问题,请参考以下文章

pig-avro:如何自定义方式,他们 avro 存储加载文件

如何在 Pig 中使用 Avro 数据

使用 piggybank 和 AvroStorage 解决 EMR 问题

指向本地文件的 AvroStorage schema_uri 不起作用

猪:无法将 java.lang.String 转换为 org.apache.avro.util.Utf8 与 STORE 中的 AvroStorage

将 avro 文件合二为一