我现在正在学习Spark,它似乎是Pandas Dataframe的大数据解决方案,但我有这个问题,这让我不确定。
目前,我正在使用HDF5存储比内存大的Pandas数据帧。HDF5是一个很好的工具,它允许我对pandas数据帧进行分块。因此,当我需要对大型Pandas数据帧进行处理时,我会分块进行处理。但Pandas不支持分布式处理,HDF5仅适用于单个PC环境。
使用Spark数据帧可能是一种解决方案,但我对Spark的理解是,数据帧必须能够容纳在内存中,并且一旦加载为Spark数据框架,Spark就会将数据帧分发给不同的工作人员来进行分布式处理。
我的理解正确吗?如果是这种情况,那么Spark如何处理大于内存的数据帧?它像HDF5一样支持分块吗?
数据帧必须能够容纳在内存中,一旦加载为Spark数据帧,Spark就会将数据帧分发给不同的工作人员来进行分布式处理。
只有当您试图将数据加载到驱动程序上,然后进行并行化时,这才是正确的。在一个典型的场景中,您以可以并行读取的格式存储数据。这意味着你的数据:
- 必须在每个工作程序上都可以访问,例如使用分布式文件系统
- 文件格式必须支持拆分(最简单的例子是普通的旧csv)
在这种情况下,每个工作者只读取数据集的自己部分,而不需要将数据存储在驱动程序内存中。所有与计算拆分相关的逻辑都由适用的Hadoop输入格式透明地处理。
关于HDF5文件,您有两个选项:
- 在驱动程序上以块为单位读取数据,从每个块构建Spark DataFrame,并生成并集结果。这效率低,但易于实现
- 分发HDF5文件并直接在工作人员上读取数据。一般来说,这更难实现,需要智能数据分发策略