avro格式详解

这篇具有很好参考价值的文章主要介绍了avro格式详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Avro介绍】

Apache Avro是hadoop中的一个子项目,也是一个数据序列化系统,其数据最终以二进制格式,采用行式存储的方式进行存储。

Avro提供了:

  • 丰富的数据结构

  • 可压缩、快速的二进制数据格式

  • 一个用来存储持久化数据的容器文件

  • 远程过程调用

  • 与动态语言的简单集成,代码生成不需要读取或写入数据文件,也不需要使用或实现RPC协议。代码生成是一种可选的优化,只值得在静态类型语言中实现。

基于以上这些优点,avro在hadoop体系中被广泛使用。除此之外,在hudi、iceberg中也都有用到avro作为元数据信息的存储格式。

【schema】

Avro依赖"schema"(模式)来实现数据结构的定义,schema通过json对象来进行描述表示,具体表现为:

  • 一个json字符串命名一个定义的类型

  • 一个json对象,其格式为`{"type":"typeName" ...attributes...}`,其中`typeName`为原始类型名称或复杂类型名称。

  • 一个json数组,表示嵌入类型的联合

schema中的类型由原始类型(也就是基本类型)(null、boolean、int、long、float、double、bytes和string)和复杂类型(record、enum、array、map、union和fixed)组成。

1、原始类型

原始类型包括如下几种:

  • null:没有值

  • boolean:布尔类型的值

  • int:32位整形

  • long:64位整形

  • float:32位浮点

  • double:64位浮点

  • bytes:8位无符号类型

  • string:unicode字符集序列

原始类型没有指定的属性值,原始类型的名称也就是定义的类型的名称,因此,schema中的"string"等价于{"type":"string"}。

2、复杂类型

Avro支持6种复杂类型:records、enums、arrays、maps、unions和fixed。

1)Records

reocrds使用类型名称"record",并支持以下属性

  • name:提供记录名称的json字符串(必选)

  • namespace:限定名称的json字符串

  • doc:一个json字符串,为用户提供该模式的说明(可选)

  • aliases:字符串的json数组,为该记录提供备用名称

  • fields:一个json数组,罗列所有字段(必选),每个字段又都是一个json对象,并包含如下属性:

    • name:字段的名称(必选)

    • doc:字段的描述(可选)

    • type:一个schema,定义如上

    • default:字段的默认值

    • order:指定字段如何影响记录的排序顺序,有效值为`"ascending"`(默认值)、"descending"和"ignore"。

    • aliases:别名

一个简单示例:

{
    "type": "record",
    "name": "LongList",
    "aliases": ["LinkedLongs"],
    "fields", [
        {"name": "value", "type": "long"},
        {"name": "next", "type": ["null", "LongList"]}
    ]
}

2)Enums

Enum使用类型名称"enum",并支持以下属性

  • name:提供记录名称的json字符串(必选)

  • namespace:限定名称的json字符串

  • aliases:字符串的json数组,为该记录提供备用名称

  • doc:一个json字符串,为用户提供该模式的说明(可选)

  • symbols:一个json数组,以json字符串的形式列出符号。在枚举中每个符号必须唯一,不能重复,每个符号都必须匹配正则表达式"[A-Za-z_][A-Za-z0-9_]*"。

  • default:该枚举的默认值。

示例:

{
    "type": "enum",
    "name": "Suit",
    "symbols": ["SPADES", "HEARTS", "DIAMONDS", "CLUBS"]
}

3) Arrays

  • item:数组中元素的schema

一个例子:声明一个value为string的array

{
    "type": "array",
    "items": "string",
    "default": []
}

4)Maps

  • values:map的值(value)的schema,其key被假定为字符串

一个例子:声明一个value为long类型,(key类型为string)的map

{
    "type": "map",
    "values": "long",
    "default": {}
}

5)Unions

联合使用json数组表示,例如[null, "test"]声明一个模式,它可以是空值或字符串。

需要注意的是:当为union类型的字段指定默认值时,默认值的类型必须与union第一个元素匹配,因此,对于包含"null"的union,通常先列出"null",因为此类型的union的默认值通常为空。

另外, union不能包含多个相同类型的schema,类型为record、fixed和eum除外。

6)Fixed

Fixed使用类型名称"fixed"并支持以下属性:

  • name:提供记录名称的json字符串(必选)

  • namespace:限定名称的json字符串

  • aliases:字符串的json数组,为该记录提供备用名称

  • doc:一个json字符串,为用户提供该模式的说明(可选)

  • size:一个整数,指定每个值的字节数(必须)

例如,16字节的数可以声明为:

{
    "type": "fixed",
    "name": "md5",
    "size": 16
}

【Avro的文件存储格式】

1、数据编码

1)原始类型

对于null类型:不写入内容,即0字节长度的内容表示;

对于boolean类型:以1字节的0或1来表示false或true;

对于int、long:以zigzag的方式编码写入

对于float:固定4字节长度,先通过floatToIntBits转换为32位整数,然后按小端编码写入。

对于double:固定8字节长度,先通过doubleToLongBits转换为64位整型,然后按小端编码写入。

对于bytes:先写入长度(采用zigzag编码写入),然后是对应长度的二进制数据内容

对于string:同样先写入长度(采用zigzag编码写入),然后再写入字符串对应utf8的二进制数据。

2)复杂类型

对于enums:只需要将enum的值所在的Index作为结果进行编码即可,例如,枚举值为["A","B","C","D"],那么0就表示”A“,3表示"D"。

对于maps:被编码为一系列的块。每个块由一个长整数的计数表示键值对的个数(采用zigzag编码写入),其后是多个键值对,计数为0的块表示map的结束。每个元素按照各自的schema类型进行编码。

对于arrays:与map类似,同样被编码为一系列的块,每个块包含一个长整数的计数,计数后跟具体的数组项内容,最后以0计数的块表示结束。数组项中的每个元素按照各自的schema类型进行编码。

对于unions:先写入long类型的计数表示每个value值的位置序号(从零开始),然后再对值按对应schema进行编码。

对于records:直接按照schema中的字段顺序来进行编码。

对于fixed:使用schema中定义的字节数对实例进行编码。

2、存储格式

在一个标准的avro文件中,同时存储了schema的信息,以及对应的数据内容。具体格式由三部分组成:

  • 魔数

固定4字节长度,内容为字符'O','b','j',以及版本号标识,通常为1

  • 元数据信息

文件的元数据属性,包括schema、数据压缩编码方式等。整个元数据属性以一个map的形式编码存储,每个属性都以一个KV的形式存储,属性名对应key,属性值对应value,并以字节数组的形式存储。最后以一个固定16字节长度的随机字符串标识元数据的结束。

  • 数据内容

而数据内容则由一个或多个数据块构成。每个数据块的最前面是一个long型(按照zigzag编码存储)的计数表示该数据块中实际有多少条数据,后面再跟一个long型的计数表示编码后的(N条)数据的长度,随后就是按照编码进行存储的一条条数据,在每个数据块的最后都有一个16字节长度的随机字符串标识块的结束。

整体存储内容如下图所示:

avro格式详解

3、存储格式

我们通过一个实际例子来对照分析下。

首先定义schema的内容,具体为4个字段的表,名称(字符串)、年龄(整型)、技能(数组)、其他(map类型),详细如下所示:

{
    "type":"record",
    "name":"person",
    "fields": [
        {
            "name": "name",
            "type": "string"
        },
        {
            "name": "age",
            "type": "int"
        },
        {
            "name": "skill",
            "type": {
                "type":"array",
                "items": "string"
            }
        },
        {
            "name": "other",
            "type": {
                "type": "map",
                "values": "string"
            }
        }
    ]
}

再按照上面的schema定义两条数据(person.json):

{"name":"hncscwc","age":20,"skill":["hadoop","flink","spark","kafka"],"other":{"interests":"basketball"}}
{"name":"tom","age":18, "skill":["java","scala"],"other":{}}

通过avro-tools可以生成一个avro文件:

java -jar avro-tools-1.7.4.jar fromjson --schema-file person.avsc person.json > person.avro

通过二进制的方式查看生成的avro文件内容:

avro格式详解

另外,对于一个已存在的文件,也可以通过avro-tools工具查看schema内容、数据内容。

[root@localhost avro]$ java -jar avro-tools-1.7.4.jar getschema ./person.avro
{
  "type" : "record",
  "name" : "person",
  "fields" : [ {
    "name" : "name",
    "type" : "string"
  }, {
    "name" : "age",
    "type" : "int"
  }, {
    "name" : "skill",
    "type" : {
      "type" : "array",
      "items" : "string"
    }
  }, {
    "name" : "other",
    "type" : {
      "type" : "map",
      "values" : "string"
    }
  } ]
}
[root@localhost avro]$ java -jar avro-tools-1.7.4.jar tojson ./person.avro
{"name":"hncscwc","age":20,"skill":["hadoop","flink","spark","kafka"],"other":{"interests":"basketball"}}
{"name":"tom","age":18,"skill":["java","scala"],"other":{}}

【小结】

本文对avro的格式定义、编码方式、以及实际存储的文件格式进行了详细说明,最后也以一个实际例子进行了对照说明。另外, 在官网中还涉及rpc的使用、mapreduce的使用,这里就没有展开说明,有兴趣的可移步官网进行查阅。

好了,这就是本文的全部内容,如果觉得本文对您有帮助,请点赞+转发,如果觉得有不正确的地方,也可以拍砖指点,最后,欢迎加我微信交流~文章来源地址https://www.toymoban.com/news/detail-421261.html

到了这里,关于avro格式详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 查看 Avro 格式的 Kafka 消息(启用了 Confluent Schema Registry )

    使用 Avro 格式传递 Kafka 消息要比 Json 更加高效,因为它是二进制格式,在启用了 Confluent Schema Registry 的情况下,会进一步地提升传输效率,因为 Avro 中的 Schema 信息将不再出现在消息中,消息体积会进一步压缩,同时,还可以利用到 Schema Registry 的其他好处,例如 Schema Evolu

    2024年01月25日
    浏览(33)
  • 大数据_Hadoop_Parquet数据格式详解

    之前有面试官问到了parquet的数据格式,下面对这种格式做一个详细的解读。 参考链接 : 列存储格式Parquet浅析 - 简书 Parquet 文件结构与优势_parquet文件_KK架构的博客-CSDN博客 Parquet文件格式解析_parquet.block.size_david\\\'fantasy的博客-CSDN博客 行组(Row Group)  按照行将数据物理上划分为

    2024年02月14日
    浏览(33)
  • 【Java万花筒】选择最适合您的数据序列化格式:比较 Avro、Protocol Buffers、JSON、XML、MessagePack和BSON

    在当今数据驱动的世界中,高效地处理和传输数据变得至关重要。选择合适的数据序列化格式对于数据存储、通信和处理的性能至关重要。本文将介绍并比较几种常用的数据序列化格式,包括Apache Avro、Protocol Buffers、JSON、XML、MessagePack和BSON。通过了解它们的概述、特点、应用

    2024年02月20日
    浏览(41)
  • viewfs://为Hadoop 中的一个特殊文件系统

    viewfs:// 是 Hadoop 中的一个特殊文件系统 URI,用于访问 Hadoop 的视图文件系统(ViewFS)。 ViewFS 是 Hadoop 提供的一种虚拟文件系统,它可以将来自多个底层文件系统的文件统一管理和访问。 通过 ViewFS,你可以在不知道底层真实文件系统细节的情况下,对文件进行读取和写入操作

    2024年02月06日
    浏览(29)
  • Hadoop中的加密解密机制——伪随机数生成算法介绍

    作者:禅与计算机程序设计艺术 Hadoop作为当下最流行的大数据处理平台,提供了丰富的功能支持,如海量数据的存储、分析与计算。其中一个重要的环节就是数据安全问题。无论是存储集群还是计算集群,都需要提供数据保护措施来确保数据的完整性和可用性。今天我将介绍

    2024年02月06日
    浏览(41)
  • 关于Hive中的存储格式及压缩格式详解

    最近面试,遇到了关于Hive的数据存储格式的问题,回答不尽人意,抽时间总结多看看关于Hive存储格式和压缩格式的内容。 Hive底层数据是以HDFS文件的形式存储在Hadoop中的,选择一个合适的文件存储格式及压缩方式,也是 Hive 优化的一个重点。不同的文件存储格式及压缩格式

    2024年02月04日
    浏览(69)
  • 介绍 Apache Spark 的基本概念和在大数据分析中的应用。

    Apache Spark 是一个快速的开源大数据处理引擎,可以用于大数据处理、机器学习、图形计算等领域。它可以在多种计算环境中运行,包括独立模式、YARN、Mesos、Kubernetes等云计算平台。 Spark基于RDD(Resilient Distributed Datasets)模型,RDD是一个不可变的分布式对象集合,可通过并行

    2024年02月10日
    浏览(33)
  • 介绍 Apache Spark 的基本概念和在大数据分析中的应用

    Apache Spark是一种基于内存计算的大数据处理框架,它支持分布式计算,并且能够处理比传统处理框架更大量的数据。以下是Apache Spark的一些基本概念和在大数据分析中的应用: RDD (Resilient Distributed Dataset):RDD是Spark的核心概念,它是一个分布式的、不可变的数据集。RDD可以从

    2024年02月13日
    浏览(39)
  • PL/SQL 中的数据导入和导出:CSV 文件格式详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在 PL/SQL 开发中,数据的导入和导出是常见的操作。本文将深入探讨如何使用 PL/SQL 导入和导出 CSV 文件格式的数据

    2024年02月12日
    浏览(36)
  • Python 中的 JSON 模块详解及 JSON 数组的输出格式示例

    正文: 在 Python 中,JSON(JavaScript Object Notation)是一种常用的数据交换格式。Python 提供了一个内置模块 json 来处理 JSON 数据。本文将详细介绍 Python 中的 json 模块,包括 JSON 对象的序列化和反序列化,以及如何处理 JSON 数组。 1. 导入 json 模块 在使用 json 模块之前,我们需要

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包