了解如何创建和使用基于Apache Avro的数据,以实现更好,更有效的传输。

在这篇文章中,我将讨论Apache Avro,这是一种开源数据序列化系统,Spark,Kafka等工具正在使用该工具进行大数据处理。

什么是Apache Avro

根据维基百科:

Avro是在Apache的Hadoop项目中开发的面向行的远程过程调用和数据序列化框架。 它使用JSON定义数据类型和协议,并以紧凑的二进制格式序列化数据。 它的主要用途是在Apache Hadoop中,它既可以提供持久数据的序列化格式,又可以提供Hadoop节点之间以及从客户端程序到Hadoop服务的通信的有线格式。 Avro使用一种架构来构造要编码的数据。 它具有两种不同类型的模式语言。 一个用于人工编辑(Avro IDL),另一个用于基于JSON的机器可读性。[3]

基本上,Avro是由Hadoop Doug Cutting的父亲开发的与语言无关的数据序列化系统。在进一步讨论Avro之前,请允许我简要讨论一下数据序列化及其优点。

什么是数据序列化和反序列化

数据序列化是将复杂对象(数组,字典,列表,类对象,JSON等)转换为字节流的过程,以便可以将它们存储或转移到其他计算机。在具有不同体系结构,硬件或操作系统的计算机之间传输数据的数据序列化的原因。在另一端接收到数据后,可以将其还原为原始格式。该过程称为反序列化。

现在您了解了所有内容,让我们深入研究并使用一些代码。

开发安装

Python应用程序中当前使用两个库。一个简单地称为avro,您可以在此处访问。另一个是FastAvro,它声称比以前的要快。两者的工作原理是相同的。由于我们正在研究一个玩具示例,因此先前的lib对我们来说足够了。因此,一如往常使用典型的pip工具进行安装:

pip install avro

Avro模式

Apache Avro格式实际上是JSON结构。可以说,Avro格式实际上是JSON数据结构和用于验证目的的架构的组合。因此,在创建扩展名为.avro的Avro文件之前,我们将创建其架构。

{"namespace": "me.adnansiddiqi", "type": "record", "name": "User", "fields": [     {"name": "name", "type": "string"},     {"name": "age",  "type": ["int", "null"]},     {"name": "gender", "type": ["string", "null"]} ]}

好的,我们来看看一段结构,在上面可以看到一个JSON结构。我们将首先提到一个namespace。它不过是一个字符串。通常,它遵循Java打包命名约定所使用的相同格式,该格式一般会是您的域名的反转,但不是必需的。之后,您提到结构的type,这里是record类型。还有其他类型,例如enum,arrays等。在此之后,我们在这里提到name是“User”。下一个是field ,可能是一个或多个。它具有必填字段(例如name 和type )以及可选字段(例如doc和alias)。 doc字段用于描述您的字段,而alias 是别名。到目前为止,一切都很好。我们创建的结构将保存在名为users.avsc的文件中。

现在,我们将编写将从架构文件读取架构的代码,然后在Avro文件中添加一些记录。稍后,我们将检索记录并显示它们。让我们来编写代码!

import avro.schemafrom avro.datafile import DataFileReader, DataFileWriterfrom avro.io import DatumReader, DatumWriterschema = avro.schema.parse(open("user.avsc").read())writer = DataFileWriter(open("users.avro", "wb"), DatumWriter(), schema)writer.append({"name": "Alyssa", "age": 25,"gender":"female"})writer.append({"name": "Ahmad", "age": 35,"gender":"male"})writer.close()reader = DataFileReader(open("users.avro", "rb"), DatumReader())for user in reader:    print(user)    print('===================')reader.close()

导入必要的模块后,我要做的第一件事就是读取架构文件。 DatumWriter负责将数据转换为输入模式的Avro格式。 DataFileWriter负责将数据写入文件中。 在插入几条记录之后,我们关闭编写器。 DataFileReader的工作方式与此类似,唯一的区别是,此处DatumReader()负责对存储在users.avro中的数据进行反序列化,然后使其可用于显示。 运行代码时,它将显示如下:

python play.py{'name': 'Alyssa', 'age': 25, 'gender': 'female'}==================={'name': 'Ahmad', 'age': 35, 'gender': 'male'}

到目前为止,一切都很好? 现在,让我们对架构进行一些更改。 我将年龄字段更改为dob,并且在运行时出现以下错误:

python play.pyTraceback (most recent call last):  File "play.py", line 8, in     writer.append({"name": "Alyssa", "age": 25,"gender":"female"})  File "/Users/AdnanAhmad/Data/anaconda3/lib/python3.7/site-packages/avro/datafile.py", line 303, in append    self.datum_writer.write(datum, self.buffer_encoder)  File "/Users/AdnanAhmad/Data/anaconda3/lib/python3.7/site-packages/avro/io.py", line 771, in write    raise AvroTypeException(self.writer_schema, datum)avro.io.AvroTypeException: The datum {'name': 'Alyssa', 'age': 25, 'gender': 'female'} is not an example of the schema {  "type": "record",  "name": "User",  "namespace": "me.adnansiddiqi",  "fields": [    {      "type": "string",      "name": "name"    },    {      "type": [        "int",        "null"      ],      "name": "dob"    },    {      "type": [        "string",        "null"      ],      "name": "gender"    }  ]}

酷,不是吗? 同样,如果您对数据进行更改,它将发出尖叫并告诉您进行修复。

结论

希望您能对Apache Avro有所了解,并了解Python如何使您使用Python在设备和系统之间传输数据。 我刚刚触及了它的表面,并且还有更多内容。 Apache Spark和Kafka还大量使用Avro进行数据传输。

kafka python框架_Python中如何使用Apache Avro——Apache的数据序列化系统相关推荐

  1. python表格多列合并_python 合并excel表格数据-如何用python从excel中同时提取两个列的数据,并生成dict(用xlrd)...

    用Python导出工程文件两个子页里的数据成为两个excel表格,但我想把它合并成个一个excel表格的两个sheet 可以采用一些操作Excel块去实现,比如xlrd.xlwt.openpyxl.x ...

  2. python处理表格数据-python读取word 中指定位置的表格及表格数据

    1.Word文档如下: 2.代码 # -*- coding: UTF-8 -*- from docx import Document def readSpecTable(filename, specT ...

  3. python+selenium+phantomJS爬取国家地表水水质自动监测实时数据发布系统——动态网页爬虫

    一.关于phantomjs 1.介绍 PhantomJS是一个为自动化而生的利器,它本质上是一个基于webkit内核的无界面浏览器,并可使用JavaScript或CoffeeScript进行编程.由于 ...

  4. python语音识别_Python中的语音识别-完整的入门指南

    python语音识别 Welcome to The Complete Beginner's Guide to Speech Recognition in Python. 欢迎使用Python语音识别完 ...

  5. python参数化_Python 中如何实现参数化测试的方法示例

    之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文想针对测试中一种很常见的测试场景,即参 ...

  6. python标准化_python中标准化

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! sdk 3.0 实现了统一化,各个语言版本的 sdk具备使用方法相同.接口调用方 ...

  7. python字符集_PYTHON 中的字符集

    Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...

  8. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  9. python什么时候用框架_Python 中三大框架各自的应用场景

    Django: 主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过 10000, 如果要实现高并发的话,就要对 django 进行二次开发,比如把整个笨重的框架给拆掉,自己写 s ...

最新文章

  1. Docker使用遇到问题Got permission denied while trying to connect to the Docker daemon socket解决方案
  2. 电子科大博士生杨超火了!2年实现Science+Nature一作双杀
  3. IPVS-DR+keepalived实现高可用负载均衡集群
  4. CC2530中常用的控制寄存器
  5. cocos2dx-Lua与Object的通讯机制
  6. matlab白噪音wav,通过matlab产生wav的白噪声.pdf
  7. vue通过class获取dom_.NET Core通过Json或直接获取图形验证码(务必收藏备用)
  8. SpringBoot(13)--- 数据库操作(集成MyBatis)
  9. 画图必备numpy函数
  10. 【转】SQL语句删除和添加外键、主键
  11. Java跳出多重循环的方法
  12. asp.net中使用下拉菜单的级联问题
  13. 谭浩强C语言(第三版)习题5.7
  14. 008/160 CrackMe Andrénalin #1
  15. 《微软System Center 2012 R2私有云部署实战》——第二章 微软私有云选型2.1 服务器选型...
  16. matlab GUIz之guide
  17. (20191227已解决)从Linux服务器下载超过4G的文件并批量操作同类型文件
  18. 裸机运行c语言,裸机_GPIO实验_C语言
  19. drupal模块_自动测试Drupal 8模块
  20. MATLAB批量改变图片大小

热门文章

  1. opencv漫水填充算法
  2. C语言大数阶乘的求法
  3. Apache Maven 入门篇 ( 上 )
  4. 配置iSCSI部署网络存储
  5. 把e.printStackTrace的堆栈信息打印在log.error()中
  6. Kotlin实现LeetCode算法题之String to Integer (atoi)
  7. SQL Server 的索引结构实例
  8. Aurora一些使用过程中碰到的问题
  9. 分析:微软最终将赢得平板电脑市场的5个理由
  10. 《编程之美》第2刷勘误