《Spark数据分析:基于Python语言 》 —1.3.2 Python对象序列化

举报
华章计算机 发表于 2020/02/12 17:30:55 2020/02/12
【摘要】 本节书摘来自华章计算机《Spark数据分析:基于Python语言 》 一书中第1章,第1.3.2节,作者是[澳] 杰夫瑞·艾文(Jeffrey Aven) ,王道远 译。

1.3.2 Python对象序列化

序列化(serialization)是对象的一种转化过程,转化后的结构可以在之后的某个时候在同一个系统或者另一个系统中恢复原样(反序列化)。

序列化,或者说对数据进行序列化和反序列化的功能,是任何分布式处理系统都离不开的,也是在Hadoop和Spark这些项目中频繁使用的。

1.JSON

JSON(JavaScript Object Notation)是一种常见的序列化格式。JSON已经扩展到JavaScript

之外,在多种平台中有使用,能支持几乎所有的编程语言。它也是网络服务常用的用来返回响应数据的结构。

Python通过json包实现了对JSON的原生支持。Python中的包是一组程序库,或者一组模块(本质上就是Python文件)。json包是用来对JSON数据进行编解码的。一个JSON对象是由键值对(字典)或者数组(列表)组成的,而这两者也可以相互嵌套。Python里的JSON对象包括用于根据键搜索、添加数据、删除数据、更新对应值,以及打印对象的方法。程序清单1.6展示了如何在Python中创建JSON对象,并进行各种操作。

程序清单1.6 在Python中使用JSON对象

 image.png

image.png

 

在PySpark中,可以在RDD中使用JSON对象,本书稍后会详细介绍这种用法。

2.pickle

pickle是Python独有的一种序列化方式。pickle比JSON更快,但是移植性不如JSON,毕竟JSON是通用的序列化格式,可以在不同语言中互读。

Python的pickle模块会把Python对象转为字节流,这样就可以传输、存储和恢复对象的状态了。

cPickle,顾名思义,是用C实现的pickle版本,因此比Python的实现要快得多,尽管用起来多了一些限制条件。cPickle模块不支持子类,而pickle模块对此是支持的。在Python中用pickle进行对象序列化和反序列化非常简单,如程序清单1.7所示。注意函数名中的单词“load”(读取)和“dump”(转存)与使用JSON进行序列化反序列化时使用的“deserialize”(反序列化)和“serialize”(序列化)是同义的。pickle.dump把对象保存到文件中,而pickle.dumps则返回字符串形式的序列化后的对象。这种设计看起来可能有点奇怪,毕竟设计时并未考虑可读性。

程序清单1.7 在Python中使用pickle序列化对象

 image.png

PySpark中,序列化和反序列化对象要使用PickleSerializer类。这包括从其他系统(比如Hadoop的SequenceFile文件)中读取序列化好的对象,并且把它们转为Python中可用的格式。

PySpark里有两个分别用来处理pickle序列化的输入文件和输出文件的方法:pickleFile和saveAsPickleFile。pickleFile是在PySpark进程间存储和传输文件的一种高效的格式。本书会在稍后详细介绍这两个方法。

除了开发者显式调用,许多Spark内部进程也会在Spark应用执行过程中在Python中调用pickle。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。