《Spark数据分析:基于Python语言 》 —1.3.2 Python对象序列化
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对象
在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序列化对象
PySpark中,序列化和反序列化对象要使用PickleSerializer类。这包括从其他系统(比如Hadoop的SequenceFile文件)中读取序列化好的对象,并且把它们转为Python中可用的格式。
PySpark里有两个分别用来处理pickle序列化的输入文件和输出文件的方法:pickleFile和saveAsPickleFile。pickleFile是在PySpark进程间存储和传输文件的一种高效的格式。本书会在稍后详细介绍这两个方法。
除了开发者显式调用,许多Spark内部进程也会在Spark应用执行过程中在Python中调用pickle。
- 点赞
- 收藏
- 关注作者
评论(0)