学习 Avro(一):初识 Avro

Apache Avro 是 Hadoop 生态圈下数据序列化框架,既可以用于 RPC 调用,又可以用于数据存储。

与 Avro 类似的序列化框架还有:

Avro 主要由两部分组成:

  • JSON 格式,定义的 schema
  • 二进制格式,定义的数据

依赖

编辑 pom.xml 文件,添加依赖:

<dependency>  
    <groupId>org.apache.avro</groupId>
    <artifactId>avro</artifactId>
    <version>1.8.2</version>
</dependency>  

Schema

user.avsc 文件:

{
    "namespace": "com.dyingbleed.avro",
    "type": "record",
    "name": "User",
    "fields": [
        {
            "name": "name",
            "type": "string"
        }
    ]
}

① namespace 命名空间,类似于 Java 中的包名

② type 类型,值 record 类似 Java 中的类

③ name 名称,类似于 Java 中的类名

④ fields 字段定义,包括字段名 name 和字段类型 string,可选是否可以为空和默认值

Schema schema;  
try (InputStream in = SerializeApplication.class.getClassLoader().getResourceAsStream("schema/user.avsc")) {  
    schema = new Schema.Parser().parse(in); // ①
    in.close();
}

① 读取 avsc 文件,并解析为 Schema 实例

序列化与反序列化

序列化 Avro:

GenericRecord record = new GenericData.Record(schema);  
record.put("name", "Anthony");

File targetFile = new File("user.avro");  
GenericDatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<>(schema);  
DataFileWriter<GenericRecord> fileWriter = new DataFileWriter<>(datumWriter);  
fileWriter.create(schema, targetFile);  
fileWriter.append(record);  
fileWriter.close();  

反序列化 Avro:

File targetFile = new File("user.avro");  
GenericDatumReader<GenericRecord> datumReader = new GenericDatumReader<>(schema);  
DataFileReader<GenericRecord> fileReader = new DataFileReader<>(targetFile, datumReader);

while (fileReader.hasNext()) {  
    GenericRecord record = fileReader.next();
    System.out.println(record);
}

参考