火花读取python3 pickle作为输入

火花读取python3 pickle作为输入,python,apache-spark,serialization,pyspark,rdd,Python,Apache Spark,Serialization,Pyspark,Rdd,我的数据以Python 3 pickle文件集的形式提供。其中大多数是熊猫数据帧的序列化 我想开始使用Spark,因为我需要一台计算机所能拥有的更多内存和CPU。此外,我将使用HDFS进行分布式存储 作为初学者,我没有找到解释如何使用pickle文件作为输入文件的相关信息 它存在吗?如果没有,是否有解决办法 非常感谢很大程度上取决于数据本身。一般来说,Spark在必须读取大文件(而不是可拆分文件)时的性能并不特别好。不过,您可以尝试使用binaryFiles方法,并将其与标准Python工具相结

我的数据以Python 3 pickle文件集的形式提供。其中大多数是熊猫
数据帧的序列化

我想开始使用Spark,因为我需要一台计算机所能拥有的更多内存和CPU。此外,我将使用HDFS进行分布式存储

作为初学者,我没有找到解释如何使用pickle文件作为输入文件的相关信息

它存在吗?如果没有,是否有解决办法


非常感谢

很大程度上取决于数据本身。一般来说,Spark在必须读取大文件(而不是可拆分文件)时的性能并不特别好。不过,您可以尝试使用
binaryFiles
方法,并将其与标准Python工具相结合。让我们从虚拟数据开始:

import tempfile
import pandas as pd
import numpy as np

outdir = tempfile.mkdtemp()

for i in range(5):
    pd.DataFrame(
        np.random.randn(10, 2), columns=['foo', 'bar']
    ).to_pickle(tempfile.mkstemp(dir=outdir)[1])
接下来,我们可以使用
bianryFiles
方法读取它:

rdd = sc.binaryFiles(outdir)
并反序列化各个对象:

import pickle
from io import BytesIO

dfs = rdd.values().map(lambda p: pickle.load(BytesIO(p)))
dfs.first()[:3]

##         foo       bar
## 0 -0.162584 -2.179106
## 1  0.269399 -0.433037
## 2 -0.295244  0.119195
一个重要的注意事项是,它通常需要比像
textFile
这样的简单方法多得多的内存

另一种方法是只对路径进行并行化,并使用可以直接从分布式文件系统读取的库,如。这通常意味着以显著更差的数据区域性为代价降低内存需求

考虑到这两个事实,通常最好以更高粒度加载的格式序列化数据

注意

SparkContext
提供了
pickleFile
方法,但名称可能会产生误导。它可以用于读取包含pickle对象而不是普通Python pickle的对象