Avro提供了两种序列化的方式:
avro-specific:
和thrift一样可以通过idl方式生成代码,生成命令:
java -jar avro-tools-1.7.4.jar compile schema data.avsc src/
avro-generic:
支持schema的动态加载,不需要重新编译就可以处理新的数据源
avro的数据类型:
基本类型:
null: no value
boolean: a binary value
int: 32-bit signed integer
long: 64-bit signed integer
float: single precision (32-bit) IEEE 754 floating-point number
double: double precision (64-bit) IEEE 754 floating-point number
bytes: sequence of 8-bit unsigned bytes
string: unicode character sequence
复杂类型:
avro支持6种复杂类型:records, enums, arrays, maps, unionsm, fixed
下面是一个定义为records例子:
{
"type": "record", // 指定record类型,(required)
"name": "AvroData", // 生成的类名称,(required)
"namespace": "com.wuwen.", // 命令空间,(optional)
"doc": "avro scheama test.", // 用来描述该schema的,(optional)
"aliases": ["avroaliases"], // name的别名,(optional)
"fields": [ // 字段名,(required)
{"name": "GUID", "type": "string"}, // 定义一个字段名为GUID,基本数据类型为string的字段
{"name": "Content", "type": "string"},
{"name": "Time", "type": "long"}
]
}
例子:
package com.wuwen; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import org.apache.avro.Schema; import org.apache.avro.file.DataFileReader; import org.apache.avro.file.DataFileWriter; import org.apache.avro.file.FileReader; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.generic.GenericDatumWriter; import org.apache.avro.generic.GenericRecord; import org.apache.avro.io.BinaryDecoder; import org.apache.avro.io.DatumReader; import org.apache.avro.io.DatumWriter; import org.apache.avro.io.DecoderFactory; import org.apache.avro.io.Encoder; import org.apache.avro.io.EncoderFactory; import org.apache.avro.specific.SpecificDatumReader; import org.apache.avro.specific.SpecificDatumWriter; import org.apache.avro.util.Utf8; public class AvroDemo { public void serializeGeneric() throws IOException { Schema schema = Schema.parse(new File("E:/avro/AvroData.avsc")); GenericRecord datum = new GenericData.Record(schema); datum.put("GUID", new Utf8("1234567")); datum.put("Content", new Utf8("Avro测试")); datum.put("Time", 20130305134700L); // Serialize it. ByteArrayOutputStream out = new ByteArrayOutputStream(); DatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(schema); Encoder encoder = EncoderFactory.get().binaryEncoder(out, null); writer.write(datum, encoder); encoder.flush(); out.close(); // Deserialize it. DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema); BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(out.toByteArray(), null); GenericRecord result = reader.read(null, decoder); System.out.printf("GUID: %s, Content: %s, Time: %s\n", result.get("GUID"), result.get("Content"), result.get("Time")); } public void serializeSpecific() throws IOException { AvroData datum = new AvroData(); datum.setGUID(new Utf8("1234567")); datum.setContent(new Utf8("1234567")); datum.setTime(20130305134700L); File tmpFile = new File("E:/avro/myAvroExample.avro"); // Serialize it. DataFileWriter<AvroData> writer = new DataFileWriter<AvroData>(new SpecificDatumWriter<AvroData>(AvroData.class)); writer.create(AvroData.SCHEMA$, tmpFile); writer.append(datum); writer.close(); // Deserialize it. FileReader<AvroData> reader = DataFileReader.openReader(tmpFile, new SpecificDatumReader<AvroData>(AvroData.class)); while (reader.hasNext()) { AvroData result = reader.next(); System.out.printf("GUID: %s, Content: %s, Time: %s\n", result.getGUID(), result.getContent(), result.getTime()); } reader.close(); } public static void main(String[] args) throws IOException { AvroDemo example = new AvroDemo(); System.out.println("Generic"); example.serializeGeneric(); System.out.println("Specific"); example.serializeSpecific(); } }
相关推荐
Avro是Apache Hadoop项目中的一个关键组件,它提供了一种高效、跨语言的数据序列化框架。相比Google的Protocol Buffers,Avro在Hadoop生态中有其独特优势和特点。 首先,让我们深入了解什么是Avro。Avro是由Hadoop...
Avro是Apache Hadoop项目的一部分,它是一种高效的数据序列化系统,被广泛应用于大数据处理和分布式计算领域。作为Hadoop开发基础知识的重要组成部分,理解并掌握Avro对于开发高效率、可扩展的分布式应用至关重要。 ...
从提供的部分内容来看,文档主要介绍了Avro序列化的几个关键方面: #### Schema Declaration(模式声明) - **PrimitiveTypes(基本类型)**:包括null、boolean、int、long、float、double、bytes、string等,其中...
protobuf(Protocol Buffers)、thrift和avro是三种广泛使用的序列化框架,它们在分布式系统、网络通信以及数据存储中扮演着重要角色。这个名为"protobuf/thrift/avro-序列化性能测试工程"的项目专注于对比这三种...
在Java和其他编程语言中,有多种序列化实现方法,包括Java自带的序列化、Writable接口(常见于Hadoop生态系统)以及Avro。下面将详细介绍这三种序列化方式。 1. **Java自带的序列化** Java内置的序列化机制是通过...
python-avro-json-serializer, 使用AVRO模式将数据序列化为JSON格式 python Avro JSON序列化程序 AvroJsonSerializer 使用AVRO模式将数据序列化为JSON格式。为什么我们需要序列化程序而不只是转到 JSON?验证数据与...
一个示例应用程序,展示了如何使用出色的Apache Avro序列化程序以及实际使用的Avro RPC。 Avro RPC使用下面的Avro序列化器,但也允许客户端方法快速便捷地执行RPC等服务器方法。 RPC参数作为Avro序列化对象通过网络...
Hadoop是什么,为什么要学习Hadoop? Hadoop是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式...
Avro4s是用Scala编写的用于的模式/类生成以及序列化/反序列化库。 目的是允许与Scala无缝使用,而无需自己编写样板转换,也不需要反射的运行时开销。 因此,这是一个基于宏的库,并在编译时生成用于Avro的代码。 该...
标题中的"avro_tests"指的是一个测试项目,其主要目的是验证和确保Apache Spark对Avro序列化的支持。Avro是Hadoop生态系统中的一个数据序列化系统,它提供了紧凑、快速、跨语言的数据交换格式,广泛用于大数据处理。...
Java的序列化与反序列化是Java开发中的一项重要...在实际应用中,要根据具体需求来选择合适的序列化库,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro等,它们提供了更高效、更灵活的序列化解决方案。
可以使用特定的序列化库,如Google的Protocol Buffers或Apache Avro,它们提供更高效的数据编码。 4. **自定义序列化**:有时,我们可能希望对序列化过程有更精细的控制,比如忽略某些字段或使用特定的序列化策略。...
此外,Java还提供了其他的序列化库,如Google的Protocol Buffers、Facebook的Thrift和Apache的Avro,它们提供了更高效、跨语言的序列化解决方案。 总结一下,序列化与反序列化是编程中必不可少的技术,它们用于数据...
为了克服这些问题,开发者可以考虑使用第三方序列化库,如Google的Protocol Buffers (protobuf)、Apache Avro或Jackson的JSON序列化。这些库通常提供更紧凑的数据表示,更好的性能,并且通常对安全性有更好的控制。 ...
Hadoop是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File ...
除此之外,还有其他的序列化库和框架,比如Google的Protocol Buffers、Apache Avro和JSON序列化库Jackson等。这些库提供了更高效、更灵活的序列化方案,支持不同的数据格式,且通常具有更好的性能和可扩展性。 总之...
描述中提到"avro序列化数据C++代码",这意味着这个压缩包包含的是用C++实现的Avro数据序列化代码。使用Visual Studio 2017可以直接打开项目,意味着这些代码是为Windows平台编写的,并且已经过测试,确认可以正常...
6. **序列化框架**:除了Java内置的序列化机制,还有一些第三方库,如Google的Protocol Buffers,Apache的Avro,和JSON序列化库如Jackson和Gson,它们提供了更高效、更灵活的数据序列化解决方案。 7. **序列化与...
Hadoop提供了两种主要的序列化框架:Writable和Protocol Buffers,以及更现代的Apache Avro、Thrift和Kryo。 1. Writable接口:这是Hadoop最初提供的序列化机制,适用于Java对象。所有可序列化的类都需要实现...