Spark DataFrame如何处理大于内存的Pandas DataFrame

时间:2015-10-29 16:21:50

标签: pandas apache-spark dataframe apache-spark-sql hdf5

我现在正在学习Spark,它似乎是Pandas Dataframe的大数据解决方案,但我有这个问题让我不确定。

目前我使用HDF5存储大于内存的Pandas数据帧。 HDF5是一个很棒的工具,它允许我对pandas数据帧进行分块。因此,当我需要对大型Pandas数据帧进行处理时,我将以块的形式进行处理。但是Pandas不支持分布式处理,而HDF5仅适用于单个PC环境。

使用Spark数据框架可能是解决方案,但我对Spark的理解是数据框架必须能够适应内存,并且一旦作为Spark数据框加载,Spark就会将数据框分发给不同的工作人员来进行分布式处理。

我的理解是否正确?如果是这种情况,那么Spark如何处理大于内存的数据帧?它是否支持像HDF5一样的分块?

1 个答案:

答案 0 :(得分:5)

  

数据框必须能够适合内存,一旦作为Spark数据帧加载,Spark就会将数据框分发给不同的工作人员来进行分布式处理。

只有当您尝试在驱动程序上加载数据然后并行化时,才会出现这种情况。在典型情况下,您可以以可并行读取的格式存储数据。这意味着您的数据:

  • 必须可以在每个工作人员上访问,例如使用分布式文件系统
  • 文件格式必须支持拆分(最简单的例子是普通的旧csv)

在这种情况下,每个工作人员只读取其自己的数据集部分,而无需将数据存储在驱动程序内存中。与计算拆分相关的所有逻辑都由适用的Hadoop输入格式透明地处理。

关于HDF5文件,您有两种选择:

  • 在驱动程序的块中读取数据,从每个块构建Spark DataFrame,以及联合结果。这样效率低但易于实施
  • 直接在工作人员上分发HDF5文件/文件并读取数据。这通常更难实施,需要智能数据分发策略