`

Avro序列化的两种实现方法:静态实现和动态实现

    博客分类:
  • Avro
 
阅读更多

 Avro 特点:

1. 丰富的数据结构

2. 紧凑、快速、二进制数据格式

3. 容器文件,持久化数据

4. 支持RPC

5. 代码生成是可选的,便于和动态语言进行整合

 

Avro 与 Thrift、Protobuf 对比:

1. Dynamic typing: Avro does not require that code be generated. Data is always accompanied by a schema that permits full processing of that data without code generation, static datatypes, etc. This facilitates construction of generic data-processing systems and languages.

2. Untagged data: Since the schema is present when data is read, considerably less type information need be encoded with data, resulting in smaller serialization size.

3. No manually-assigned field IDs: When a schema changes, both the old and new schema are always present when processing data, so differences may be resolved symbolically, using field names.

 

以下是下载安装步骤:

 

1. 下载avro-tools-1.8.1.jar, 导入开发包

http://avro.apache.org/releases.html

https://mirrors.tuna.tsinghua.edu.cn/apache/avro/avro-1.8.1/java/ 

 

导入开发包:

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

 

2. 定义schema文件user.avsc

{"namespace": "example.avro",
 "type": "record",
 "name": "User",
 "fields": [
     {"name": "name", "type": "string"},
     {"name": "favorite_number",  "type": ["int", "null"]},
     {"name": "favorite_color", "type": ["string", "null"]}
 ]
}

 

 3. 生成java代码,静态实现

 语法:java -jar /path/to/avro-tools-1.8.1.jar compile schema <schema file> <destination>

java -jar /path/to/avro-tools-1.8.1.jar compile schema user.avsc .

public class SerializationByAvroSchema {
	
	
	public static void main(String[] args) throws Exception{
		readAvro() ;
	}

	static void writeAvro() throws Exception{
		Schema schema = new Schema.Parser().parse(new File("D:/tmp/user.avsc"));
		GenericRecord user1 = new GenericData.Record(schema);
		user1.put("name", "Alyssa");
		user1.put("favorite_number", 256);
		user1.put("favorite_color", "red");
		
		GenericRecord user2 = new GenericData.Record(schema);
		user2.put("name", "Alyssa2");
		user2.put("favorite_number", 258);
		user2.put("favorite_color", "green");

		DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
		DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
		
		dataFileWriter.create(schema, new File("D:/tmp/users.avro"));
		dataFileWriter.append(user1);
		dataFileWriter.append(user2);
		dataFileWriter.close();
	}
	
	static void readAvro() throws Exception{
		Schema schema = new Schema.Parser().parse(new File("D:/tmp/user.avsc"));
		
		File file = new File("D:/tmp/users.avro");
		DatumReader<GenericRecord> userDatumReader = new GenericDatumReader<GenericRecord>(schema);
		DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(file, userDatumReader);
		GenericRecord user = null;
		while (dataFileReader.hasNext()) {
			user = dataFileReader.next(user);
			System.out.println(user);
		}
		dataFileReader.close();
	}
}

 

4. 不生成java代码 动态实现

public class SerializationByAvroClass {

	public static void main(String[] args) throws Exception{
		//readAvro();
		//writeJavaObject();
	}
	
	static void writeAvro() throws Exception{
		User user1 = new User();
		user1.setName("Alyssa");
		user1.setFavoriteNumber(256);

		User user2 = new User("Ben", 7, "red");

		User user3 = User.newBuilder()
		             .setName("Charlie")
		             .setFavoriteColor("blue")
		             .setFavoriteNumber(null)
		             .build();

		DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(User.class);
		DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(userDatumWriter);
		dataFileWriter.create(user1.getSchema(), new File("D:/tmp/users.avro"));
		dataFileWriter.append(user1);
		dataFileWriter.append(user2);
		dataFileWriter.append(user3);
		dataFileWriter.close();
	}
	
	static void readAvro() throws Exception{
		File file = new File("D:/tmp/users.avro");
		DatumReader<User> userDatumReader = new SpecificDatumReader<User>(User.class);
		DataFileReader<User> dataFileReader = new DataFileReader<User>(file, userDatumReader);
		User user = null;
		while (dataFileReader.hasNext()) {
			user = dataFileReader.next(user);
			System.out.println(user);
		}
		dataFileReader.close();
	}

}

 

 

 

分享到:
评论

相关推荐

    avro_sample.rar

    描述中提到"avro序列化数据C++代码",这意味着这个压缩包包含的是用C++实现的Avro数据序列化代码。使用Visual Studio 2017可以直接打开项目,意味着这些代码是为Windows平台编写的,并且已经过测试,确认可以正常...

    Java序列化的机制和原理

    Java序列化是Java平台提供的一种将对象转换为字节流,以便存储、在网络上传输或者在...为了提高效率和安全性,有时可以考虑使用自定义的序列化方法或者其他的序列化库,如Google的Protocol Buffers或Apache Avro等。

    利用AVRO定义avdl文件示例

    AVRO提供了丰富的数据结构类型、快速序列化以及支持动态类型语言和静态类型语言。 数据定义语言avdl是AVRO用于定义数据结构和远程过程调用协议的一种声明性语言。它是AVRO框架中定义数据模型和RPC接口的工具。通过...

    序列化与反序列化的通俗解释及主要序列化的方法介绍

    IDL文件编译后,会在各个目标语言中生成相应的库,如Stub和Skeleton库,这两部分分别负责客户端和服务端的序列化和反序列化工作。 在实际应用中,有多种序列化方法可供选择: 1. XML(eXtensible Markup Language...

    commons-avro_2.10-0.0.3.zip

    【标题】"commons-avro_2.10-0.0.3.zip" 提供的是Apache Commons Avro的相关版本,这是一个与Apache Hadoop相关的项目,主要处理Avro数据序列化和反序列化的库。Apache Avro是一个数据序列化系统,它设计用于高效地...

    avro-specificdata-thread-safety-demo:用于演示 Avro SpecificData 类的线程安全问题的项目

    Avro是Apache Hadoop项目的一部分,它是一种数据序列化系统,用于高效地处理和存储数据。在Java中,Avro提供了两种主要的数据访问接口:GenericData和SpecificData。本项目"avro-specificdata-thread-safety-demo...

    梳理的一些java开发中用上的框架和开发工具,肯定会遗漏,欢迎补充

    Apache Avro 是一种数据序列化系统,支持丰富的数据结构。 - **Thrift**: 工具。Apache Thrift 是一套跨语言的服务开发框架。 - **Protobuf**: 工具。Protocol Buffers (简称 Protobuf) 是Google的一种灵活高效的...

    powermock-examples-apachecli-1.5.5.zip

    如果" gfc-avro-master "实际上是一个包含的子项目,那么它可能是关于如何在Scala中使用Avro进行数据序列化和反序列化的示例。Scala是一种多范式编程语言,结合了函数式和面向对象编程的特点,常用于大数据处理和...

    Hadoop研究周记.pdf

    8. **Avro**:Avro是Hadoop生态中的数据序列化系统,提供了一种紧凑、高效的二进制数据格式,支持动态语言和静态语言的互操作。 【Avro和JSON】 Avro是基于JSON模式的数据序列化系统,但比JSON更加优化,用于存储...

    Google +Hadoop使用编程

    Avro的设计目标是为Hadoop提供更快、更紧凑的数据序列化方法,特别是在RPC场景中。由于其高性能和灵活性,Avro已经成为Hadoop生态系统中广泛使用的组件之一。 #### Hadoop Common:核心组件 **Hadoop Common** ...

    常见大数据处理框架比较研究.pdf

    如HBase(分布式NoSQL数据库)、Hive(基于Hadoop的数据仓库工具,支持SQL查询)、Pig(用于大数据分析的高级语言)、Sqoop(用于数据导入导出的工具)、Avro(数据序列化系统)和ZooKeeper(分布式协调服务)等。...

Global site tag (gtag.js) - Google Analytics