在Spark中使用广播变量时,选择合适的序列化格式是非常重要的。这里重点讲的是Python中的序列化。
1.序列化和反序列化
序列化就是把数据变成可存储或可传输的过程的,只有序列化后的数据才可以写入到磁盘或者通过网络传输到Spark集群的其他节点上。反序列化则相反,反序列就是把序列化的变量重新转到内存里。
2.Python包的使用
2.1 pickle包
pickle包主要使用的就是4个函数。这个只适用于在python环境中传输。
pickle.dump() | 将任意对象转化成bytes,并写入文件中。 |
pickle.dumps() | 将任意对象转化成bytes. |
pickle.loads() | 从bytes中反序列化出对象 |
pickle.load() | 从文件中反序列出对象 |
pickle.load()和pickle.dump()用法:
pickle.loads()和pickle.dumps()用法:
但是这里要注意,不要把使用pickle.dumps()方法得到的二进制字符串直接存放到文件中,容易导致UnpicklingError错误(因为文件对象f可能会将二进制串中的特殊字符当做换行符处理)。比如:
另外,还有一个与pickle功能相似的包,即cPickle,这个包底层使用c语言写的,所以运行速度要比pickle包快。