【问题标题】:Spark reading python3 pickle as inputSpark读取python3 pickle作为输入
【发布时间】:2016-07-14 00:07:45
【问题描述】:

我的数据以 Python 3 腌制文件集的形式提供。大部分是熊猫DataFrames的序列化。

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

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

它存在吗?如果没有,有什么解决方法吗?

非常感谢

【问题讨论】:

    标签: python apache-spark serialization pyspark rdd


    【解决方案1】:

    很大程度上取决于数据本身。一般来说,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 等简单方法更多的内存。

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

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

    注意

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2016-11-24
      • 2022-01-01
      • 2019-06-14
      • 1970-01-01
      相关资源
      最近更新 更多