ETL工具-nifi干货系列 第四讲 Avro schema 序列化框架

一、在使用nifi的过程中会使用到遇到avro schema、avro data、avroReader、avroWriter等,所以本节课和大家一起学习下avro相关知识。

 二、什么是Avro

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

三、什么是avro schema

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

  • 一个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"。

demo 如下:

{"type": "record","name": "person","aliases": ["xiaojingang"],"fields", [{"name": "id", "type": "long"},{"name": "name", "type": "string"}]
}

2)Enums

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

  • name:提供记录名称的json字符串(必选)
  • namespace:限定名称的json字符串
  • aliases:字符串的json数组,为该记录提供备用名称
  • doc:一个json字符串,为用户提供该模式的说明(可选)
  • symbols:一个json数组,以json字符串的形式列出符号。在枚举中每个符号必须唯一,不能重复,每个符号都必须匹配正则表达式"[A-Za-z_][A-Za-z0-9_]*"。
  • default:该枚举的默认值。

demo 如下:

{"type": "enum","name": "personType","symbols": ["xiaojinang", "dajingang"]
}

3) Arrays

  • item:数组中元素的schema

声明一个value为string的array,demo如下:

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

4)Maps

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

声明一个value为long类型,(key类型为string)的map,demo如下:

{"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字节的数,demo如下:

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

四、avro的优点

Avro 格式相比 JSON 具有以下几个优点:

1. 紧凑的数据表示: Avro 使用二进制格式进行数据存储,相比 JSON 的文本格式,二进制数据通常更加紧凑,占用更小的存储空间。这意味着在网络传输和持久化存储时,Avro 可以减少数据的大小,降低传输和存储成本。

2. 快速的序列化和反序列化: Avro 的二进制格式使得序列化和反序列化的过程更加高效。相比 JSON 的文本解析,Avro 的二进制序列化和反序列化速度更快,特别是对于大型数据集,性能提升更为显著。

3. Schema 的支持: Avro 要求数据必须按照预先定义的 schema 进行序列化和反序列化。这意味着数据的结构和类型在传输过程中是明确的,可以提供更强的数据验证和类型安全性。而 JSON 是一种自描述的文本格式,数据结构和类型信息嵌入在数据中,有时候可能存在解析不准确或不一致的情况。

4. Schema 的演化: Avro 允许 schema 的演化,即可以在不破坏现有数据的前提下对 schema 进行更新。这使得系统可以灵活地适应数据结构的变化,而无需进行大规模的数据迁移。相比之下,JSON 的结构变更可能需要更复杂的处理和数据转换。

5. 支持多种语言: Avro 提供了多种编程语言的支持,包括 Java、Python、C++ 等。通过 Avro 的各语言库,可以方便地在不同的平台和系统中进行数据交换和处理。

Avro 格式相对于 JSON 具有更高的效率、更严格的数据约束和更好的可扩展性,特别适用于大规模数据处理和分布式系统中的数据交换与存储。

 五、示例演示:

首先定义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":"java小金刚","age":20,"skill":["java","go","python","kafka"],"other":{"interests":"basketball"}}
{"name":"java大金刚","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-tools工具查看schema内容、数据内容。

java -jar avro-tools-1.7.4.jar getschema person.avro

java -jar avro-tools-1.7.4.jar tojson person.avro

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/570609.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java网络原理(四)----tcp特性

一.滑动窗口 滑动窗口:可以提高传输效率,准确的来说是让tcp在可靠传输的前提下,效率不要太拉胯。使用滑动窗口不能使tcp变的比UDP块,但能减少差距。 前面谈过tcp的传输数据的时,会把数据进行编号,每次传固…

iOS - Runtime - Class-方法缓存(cache_t)

文章目录 iOS - Runtime - Class-方法缓存(cache_t)1. 散列表的存取值 iOS - Runtime - Class-方法缓存(cache_t) Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,可以提高…

两区域二次调频风火机组,麻雀启发式算法改进simulink与matlab联合

区域1结果 区域2结果 红色曲线为优化后结果〔风火机组二次调频〕

使用npm i进行admin依赖安装的时候出现问题

提示: npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/string-width failed, reason: certificate has expired 切换淘宝源到http或者更换其他国内镜像 npm config set registry http:/…

Go语言学习Day4:函数(上)

名人说:莫愁千里路,自有到来风。 ——钱珝 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 1、函数的概念与定义①函数的概念②函数的具体定义③多返回值 2、函数参数与作用域①可变参数②形…

Visio Viewer for Mac(Visio文件查看工具)

Visio Viewer for Mac是一款专为Mac用户设计的Microsoft Visio文件查看器。它拥有直观易用的用户界面,使得用户可以快速加载和显示Visio文件,无需安装完整的Microsoft Visio软件。 软件下载:Visio Viewer for Mac3.1.0激活版 Visio Viewer fo…

配置Web运行环境与第一个网页

安装与配置Web环境: 如下使用了VSC作为web的运行环境。 下面是VSC的官网点击进入:Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download 1.下载 进入官网后可以看到有windows,linux,还有苹果按照自己的系统下载&…

204基于matlab的图像融合

基于matlab的图像融合,包括三种方式,加权、PCA、IHS变换。比较三者融合后的图像差异。程序已调通,可直接运行。 204 matlab 图像融合 信息融合 - 小红书 (xiaohongshu.com)

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件,这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

负氧离子监测站:创造健康生活环境

TH-FZ5在蓝天白云之下,那一座座高耸的全彩屏负氧离子监测站,如同一支支科技的绿芽,静静破土而出,为这片土地带来了新的生命力。这些现代化的设备不仅美化了环境,更是我们呼吸健康守护者,它们的存在让我们的…

使用ai智能写作场景之gpt整理资料,如何ai智能写作整理资料

Ai智能写作助手:Ai智能整理资料小助手 Ai智能整理资料小助手可试用3天! 通俗的解释一下怎么用ChatGPT来进行资料整理: 搜寻并获取指定数量的特定领域文章: 想像你在和我说话一样,告诉我你想要多少篇关于某个话题的文…

oracle补丁升级(19.3-19.22)

一、备份原来的opatch和数据库文件 这里要根据自己的路径: mv /u01/app/oracle/product/19.3.0/db_1/OPatch /u01/app/oracle/product/19.3.0/db_1/OPatch.bakcd /u01/app mkdir -p /u01/app/backup tar -pcvf /u01/app/backup/oracle_backup.tar /u01/app/oracle/…