`
GQM
  • 浏览: 24814 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[笔记]avro 介绍及官网例子

阅读更多
Apache Avro是一个独立于编程语言的数据序列化系统。旨在解决Hadoop中Writable类型的不足:缺乏语言的可移植性。其强调数据的自我描述,依赖于它的schema。即支持动态加载schema,动态映射;也支持代码生成的描述性映射。
官网的介绍:
引用
Apache Avro™ is a data serialization system. Avro provides:
  • Rich data structures.
  • A compact, fast, binary data format.
  • A container file, to store persistent data.
  • Remote procedure call (RPC).
  • Simple integration with dynamic languages. Code generation is not required to read or write data files nor to use or implement RPC protocols. Code generation as an optional optimization, only worth implementing for statically typed languages.

  • 官网例子:
    依赖
    <dependency>
    	<groupId>org.apache.avro</groupId>
    	<artifactId>avro</artifactId>
    	<version>${avro.version}</version>
    </dependency>
    

    插件
    <plugin>
    	<groupId>org.apache.avro</groupId>
    	<artifactId>avro-maven-plugin</artifactId>
    	<version>${avro.version}</version>
    	<executions>
    		<execution>
    			<phase>generate-sources</phase>
    			<goals>
    				<goal>schema</goal>
    			</goals>
    			<configuration>
    				<sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
    				<outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
    			</configuration>
    		</execution>
    	</executions>
    </plugin>
    

    schemas:(src/main/avro/user.avsc)
    {"namespace": "com.sanss.hadoop.demos.avro",
     "type": "record",
     "name": "User",
     "fields": [
         {"name": "name", "type": "string"},
         {"name": "favorite_number",  "type": ["int", "null"]},
         {"name": "favorite_color", "type": ["string", "null"]}
     ]
    }
    
  • Spedic Java Mapping
  • 生成java文件:
    mvn clean compile
    

    创建对象
    		User user1 = new User();
    		user1.setName("Alyssa");
    		user1.setFavoriteNumber(256);
    		// Leave favorite color null
    
    		// Alternate constructor
    		User user2 = new User("Ben", 7, "red");
    
    		// Construct via builder
    		User user3 = User.newBuilder().setName("Charlie")
    				.setFavoriteColor("blue").setFavoriteNumber(null).build();
    

    序列化
    		// Serialize to disk
    		File file = new File("users.avro");
    		DatumWriter<User> userDatumWriter = new SpecificDatumWriter<User>(
    				User.class);
    		try (DataFileWriter<User> dataFileWriter = new DataFileWriter<User>(
    				userDatumWriter);) {
    			dataFileWriter.create(User.SCHEMA$, file);
    			dataFileWriter.append(user1);
    			dataFileWriter.append(user2);
    			dataFileWriter.append(user3);
    			dataFileWriter.close();
    		}
    

    反序列化
    		// Deserialize Users from disk
    		DatumReader<User> userDatumReader = new SpecificDatumReader<User>(
    				User.class);
    		try (DataFileReader<User> dataFileReader = new DataFileReader<User>(
    				file, userDatumReader);) {
    			User user = null;
    			while (dataFileReader.hasNext()) {
    				// Reuse user object by passing it to next(). This saves us from
    				// allocating and garbage collecting many objects for files with
    				// many items.
    				user = dataFileReader.next(user);
    				System.out.println(user);
    			}
    		}
    

    {"name": "Alyssa", "favorite_number": 256, "favorite_color": null}
    {"name": "Ben", "favorite_number": 7, "favorite_color": "red"}
    {"name": "Charlie", "favorite_number": null, "favorite_color": "blue"}
  • Generic Java Mapping
  • 创建对象
    		Schema schema = new Schema.Parser().parse(new File(
    				GenericJavaMappingDemo.class.getClassLoader()
    						.getResource("user.avsc").toURI()));
    		GenericRecord user1 = new GenericData.Record(schema);
    		user1.put("name", "Alyssa");
    		user1.put("favorite_number", 256);
    		// Leave favorite color null
    
    		GenericRecord user2 = new GenericData.Record(schema);
    		user2.put("name", "Ben");
    		user2.put("favorite_number", 7);
    		user2.put("favorite_color", "red");
    

    序列化
    		// Serialize users to disk
    		File file = new File("users.avro");
    		DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(
    				schema);
    		try (DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(
    				datumWriter);) {
    			dataFileWriter.create(schema, file);
    			dataFileWriter.append(user1);
    			dataFileWriter.append(user2);
    			dataFileWriter.close();
    		}

    反序列化
    		// Deserialize users from disk
    		DatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>(
    				schema);
    		try (DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(
    				file, datumReader);) {
    			GenericRecord user = null;
    			while (dataFileReader.hasNext()) {
    				// Reuse user object by passing it to next(). This saves us from
    				// allocating and garbage collecting many objects for files with
    				// many items.
    				user = dataFileReader.next(user);
    				System.out.println(user);
    			}
    		}

    {"name": "Alyssa", "favorite_number": 256, "favorite_color": null}
    {"name": "Ben", "favorite_number": 7, "favorite_color": "red"}
  • Schemas介绍:
  • Avro依赖于schemas,schemas使用JSON定义,支持基本的类型包括null, boolean, int, long, float, double, bytes , string;支持的复合类型包括record, enum, array, map, union, fixed。avro可以通过schemas自动生成代码来表示avro的数据类型(Spedific Java mapping);也可以动态映射(Generic Java mapping)。(Reflect Java mapping不推荐)。
    类型名称描述
    null空值
    boolean二进制值
    int32位带符号整数
    long64位带符号整数
    float单精度32位浮点数IEEE754
    double双精度64位浮点数IEEE754
    bytes8位无符号字节序列
    stringUnicode字符序列
    record任意类型的一个命名字段集合,JSON对象表示
    enum一个命名的值集合
    array未排序的对象集合,对象的模式必须相同
    map未排序的对象键/值对。键必须是字符串,值可以是任何类型,但必须模式相同
    union模式的并集,可以用JSON数组表示,每个元素为一个模式
    fixed一组固定数量的8位无符号字节
    分享到:
    评论

    相关推荐

      avro的avro-1.8.1的jar

      这是关于avro的avro-1.8.1版本的avro-tools的一个jar包

      avro-tool工具jar包

      Avro工具jar包是Avro的一部分,主要用于处理Avro格式的数据,包括编译Avro模式,转换数据,以及合并或拆分Avro文件等。在这个版本1.8.2中,它已经被验证为功能正常且可直接从Maven官方库免费获取。 首先,让我们...

      avro-1.10.0-API文档-中文版.zip

      赠送jar包:avro-1.10.0.jar; 赠送原API文档:avro-1.10.0-javadoc.jar; 赠送源代码:avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:avro-1.10.0.pom; 包含翻译后的API文档:avro-1.10.0-javadoc-API文档-...

      avro的avro-tools-1.8.2的jar

      这是一个关于avro的1.8.2版本的avro-tools-1.8.2的jar包

      Avro C API接口库接口调用示例

      **Avro C API接口库接口调用示例详解** Avro是一种数据序列化系统,它设计用于高效地处理大量数据,特别是在分布式计算环境中。Avro提供了多种语言的API,包括C,使得开发者能够轻松地在C应用程序中使用Avro数据...

      利用AVRO定义avdl文件示例

      在讲解如何使用AVRO定义avdl文件示例之前,我们需要先了解什么是AVRO以及AVRO的数据定义语言avdl。AVRO是一种跨语言的序列化框架,用于实现数据序列化以及远程过程调用(RPC)。它是Apache软件基金会旗下的一个项目。...

      Java读写avro所需jar

      Java读写Avro所需Jar是Java开发者在处理Avro数据时必须依赖的库文件。Avro是由Apache Hadoop项目开发的一个数据序列化系统,它的设计目标是提供高效的、跨语言的数据交换方式。在这个场景中,"avro-1.7.7.jar" 和 ...

      avro-tools-1.8.2.jar

      《深入理解Avro工具与Java应用:以avro-tools-1.8.2.jar为例》 在大数据处理领域,Avro扮演着至关重要的角色。它是由Apache Hadoop项目开发的一种数据序列化系统,旨在提高数据交换的效率和便利性。本文将详细探讨...

      parquet-avro-1.10.0-API文档-中文版.zip

      赠送jar包:parquet-avro-1.10.0.jar; 赠送原API文档:parquet-avro-1.10.0-javadoc.jar; 赠送源代码:parquet-avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:parquet-avro-1.10.0.pom; 包含翻译后的API文档...

      avro-rpc程序示例

      **Avro RPC简介** Avro是Hadoop生态系统中的一个关键组件,由Apache软件基金会开发,主要用作数据序列化系统。它提供了一种高效的、语言无关的、版本化的数据序列化机制,使得不同编程语言之间可以方便地交换数据。...

      avro-tools-1.8.1.jar

      avro 工具类 java -jar avro-tools-1.8.1.jar tojson --pretty test.avro &gt; output.json

      flink-avro-1.10.0-API文档-中文版.zip

      赠送jar包:flink-avro-1.10.0.jar; 赠送原API文档:flink-avro-1.10.0-javadoc.jar; 赠送源代码:flink-avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:flink-avro-1.10.0.pom; 包含翻译后的API文档:flink-...

      avro-1.8.2-API文档-中英对照版.zip

      赠送jar包:avro-1.8.2.jar; 赠送原API文档:avro-1.8.2-javadoc.jar; 赠送源代码:avro-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-1.8.2.pom; 包含翻译后的API文档:avro-1.8.2-javadoc-API文档-中文...

      avro-1.10.0-API文档-中英对照版.zip

      赠送jar包:avro-1.10.0.jar; 赠送原API文档:avro-1.10.0-javadoc.jar; 赠送源代码:avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:avro-1.10.0.pom; 包含翻译后的API文档:avro-1.10.0-javadoc-API文档-...

      avro linux C++动态库

      Avro是一种高效的序列化框架,由Apache开发,广泛应用于大数据处理和存储。它提供了一种紧凑、快速且可跨语言的数据交换格式,使得不同编程语言之间的数据交换变得简单。在Linux环境中,C++开发者通常会使用Avro的...

      avro_sample.rar

      标题中的"avro_sample.rar"表明这是一个关于Avro的示例项目,Avro是一种数据序列化系统,由Apache Hadoop项目开发。它被设计用来高效地处理和交换各种语言之间的数据。Avro提供了丰富的数据模式定义,允许在不同的...

      avro_tutorial

      **Avro教程** 在IT行业中,数据序列化是至关重要的,它允许我们将对象的状态转换为可以在网络上传输或存储在磁盘上的字节流。Avro是Apache Hadoop项目的一部分,是一个高效的数据序列化系统,特别适用于分布式计算...

      avro-1.8.2-API文档-中文版.zip

      赠送jar包:avro-1.8.2.jar; 赠送原API文档:avro-1.8.2-javadoc.jar; 赠送源代码:avro-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-1.8.2.pom; 包含翻译后的API文档:avro-1.8.2-javadoc-API文档-中文...

      apache avro 简介

      Apache Avro是Hadoop生态系统中的一个关键组件,它是一个数据序列化系统,旨在提供高效的、易于使用的数据交换格式。Avro的数据模型与JSON类似,但更加强大且适合大规模数据处理。它的设计目标是简化分布式应用程序...

      avro-1.11.0-API文档-中文版.zip

      赠送jar包:avro-1.11.0.jar; 赠送原API文档:avro-1.11.0-javadoc.jar; 赠送源代码:avro-1.11.0-sources.jar; 赠送Maven依赖信息文件:avro-1.11.0.pom; 包含翻译后的API文档:avro-1.11.0-javadoc-API文档-...

    Global site tag (gtag.js) - Google Analytics