`
fwuwen
  • 浏览: 16262 次
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

关于avro序列化

 
阅读更多

      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序列化

    Avro是Apache Hadoop项目中的一个关键组件,它提供了一种高效、跨语言的数据序列化框架。相比Google的Protocol Buffers,Avro在Hadoop生态中有其独特优势和特点。 首先,让我们深入了解什么是Avro。Avro是由Hadoop...

    Avro数据序列化系统(1)

    Avro是Apache Hadoop项目的一部分,它是一种高效的数据序列化系统,被广泛应用于大数据处理和分布式计算领域。作为Hadoop开发基础知识的重要组成部分,理解并掌握Avro对于开发高效率、可扩展的分布式应用至关重要。 ...

    Avro 1.8.2 序列化规范

    从提供的部分内容来看,文档主要介绍了Avro序列化的几个关键方面: #### Schema Declaration(模式声明) - **PrimitiveTypes(基本类型)**:包括null、boolean、int、long、float、double、bytes、string等,其中...

    protobuf/thrift/avro-序列化性能测试工程

    protobuf(Protocol Buffers)、thrift和avro是三种广泛使用的序列化框架,它们在分布式系统、网络通信以及数据存储中扮演着重要角色。这个名为"protobuf/thrift/avro-序列化性能测试工程"的项目专注于对比这三种...

    几种序列化的实现方法 java自带, Writable, Avro

    在Java和其他编程语言中,有多种序列化实现方法,包括Java自带的序列化、Writable接口(常见于Hadoop生态系统)以及Avro。下面将详细介绍这三种序列化方式。 1. **Java自带的序列化** Java内置的序列化机制是通过...

    python-avro-json-serializer, 使用AVRO模式将数据序列化为JSON格式.zip

    python-avro-json-serializer, 使用AVRO模式将数据序列化为JSON格式 python Avro JSON序列化程序 AvroJsonSerializer 使用AVRO模式将数据序列化为JSON格式。为什么我们需要序列化程序而不只是转到 JSON?验证数据与...

    HelloAvro:一个示例应用程序,展示了如何使用很棒的Apache Avro序列化程序

    一个示例应用程序,展示了如何使用出色的Apache Avro序列化程序以及实际使用的Avro RPC。 Avro RPC使用下面的Avro序列化器,但也允许客户端方法快速便捷地执行RPC等服务器方法。 RPC参数作为Avro序列化对象通过网络...

    Hadoop大数据零基础实战培训教程- Avro数据序列化系统(1)

    Hadoop是什么,为什么要学习Hadoop? Hadoop是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式...

    avro4s:Scala的Avro模式生成和序列化反序列化

    Avro4s是用Scala编写的用于的模式/类生成以及序列化/反序列化库。 目的是允许与Scala无缝使用,而无需自己编写样板转换,也不需要反射的运行时开销。 因此,这是一个基于宏的库,并在编译时生成用于Avro的代码。 该...

    avro_tests:测试火花的更改以支持Avro序列化

    标题中的"avro_tests"指的是一个测试项目,其主要目的是验证和确保Apache Spark对Avro序列化的支持。Avro是Hadoop生态系统中的一个数据序列化系统,它提供了紧凑、快速、跨语言的数据交换格式,广泛用于大数据处理。...

    java serializable 序列化与反序列化

    Java的序列化与反序列化是Java开发中的一项重要...在实际应用中,要根据具体需求来选择合适的序列化库,如Google的Protocol Buffers、Facebook的Thrift或Apache Avro等,它们提供了更高效、更灵活的序列化解决方案。

    序列化与反序列化经典例子

    可以使用特定的序列化库,如Google的Protocol Buffers或Apache Avro,它们提供更高效的数据编码。 4. **自定义序列化**:有时,我们可能希望对序列化过程有更精细的控制,比如忽略某些字段或使用特定的序列化策略。...

    序列化与反序列化Demo

    此外,Java还提供了其他的序列化库,如Google的Protocol Buffers、Facebook的Thrift和Apache的Avro,它们提供了更高效、跨语言的序列化解决方案。 总结一下,序列化与反序列化是编程中必不可少的技术,它们用于数据...

    Java序列化_Java序列化结构_

    为了克服这些问题,开发者可以考虑使用第三方序列化库,如Google的Protocol Buffers (protobuf)、Apache Avro或Jackson的JSON序列化。这些库通常提供更紧凑的数据表示,更好的性能,并且通常对安全性有更好的控制。 ...

    Hadoop大数据零基础实战培训教程_Avro数据序列化系统.rar

    Hadoop是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File ...

    对象的序列化和反序列化

    除此之外,还有其他的序列化库和框架,比如Google的Protocol Buffers、Apache Avro和JSON序列化库Jackson等。这些库提供了更高效、更灵活的序列化方案,支持不同的数据格式,且通常具有更好的性能和可扩展性。 总之...

    avro_sample.rar

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

    Java实现序列化例子

    6. **序列化框架**:除了Java内置的序列化机制,还有一些第三方库,如Google的Protocol Buffers,Apache的Avro,和JSON序列化库如Jackson和Gson,它们提供了更高效、更灵活的数据序列化解决方案。 7. **序列化与...

    Hadoop序列化机制

    Hadoop提供了两种主要的序列化框架:Writable和Protocol Buffers,以及更现代的Apache Avro、Thrift和Kryo。 1. Writable接口:这是Hadoop最初提供的序列化机制,适用于Java对象。所有可序列化的类都需要实现...

Global site tag (gtag.js) - Google Analytics