我正在尝试读取保存在hdfs中的hadoop中的avro格式数据。
但是我看到的大多数示例都要求我们解析一个架构来完成工作。
但我无法理解该要求。我使用pig和avro,并且从未传递过架构信息。

因此,我想我可能会缺少一些东西。基本上,如果我没有架构信息,什么是在hadoop mapreduce中读取avro文件的好方法?
谢谢

最佳答案

没错,Avro严格要求事先知道类型。如果您不了解架构,我所知道的唯一选择就是将其作为GenericRecord读取。这是如何执行此操作的摘要

public class MyMapper extends extends Mapper<AvroKey<GenericRecord>, NullWritable, ... > {
    @Override
    protected void map(AvroKey<GenericRecord> key, NullWritable value, Context context) throws IOException, InterruptedException {
        GenericRecord datum = key.datum();
        Schema schema = datum.getSchema();
        Object field1 = datam.get(0);
        Object someField = datam.get("someField");
        ...
    }
}

当然,您不会有很好的getter和setter,因为Java不知道它是什么类型。唯一可用的获取方法将按位置或名称检索字段。您必须将结果转换为您知道该字段为的类型。如果您不知道,则必须对每种可能性进行instanceof检查,因为Java是静态编译的(这也是为什么它没有像您最初认为可以访问该模式那样没有帮助的原因)。

但是,如果您知道它的类型可能是(或应该是),则可以在从avsc生成的类上调用getSchema()(您希望输入是),创建它的新实例,然后将字段一一映射到GenericRecord中的那个新对象。这将使您可以重新访问常规的Avro方法。当然,在处理联合,空值和架构版本控制时,这会变得更加复杂。

07-24 09:38
查看更多