如何强制Spark DataFrames的持久化到内存



我正在使用withColumn和窗口操作(使用Python/Spark)构建许多新列。这会导致大量沿袭,从而减慢操作速度。实际上,每隔几步就将DataFrame持久化到磁盘会有很大帮助。

但是,我如何方便地在内存中缓存DataFrame并强制物化以减少沿袭?

(我看到了关于count的建议,但我的印象是只适用于RDD?)

首先,计数也适用于数据帧。任何覆盖整个数据帧的操作都足够了(计数将覆盖所有记录,因此将实现整个数据帧)。

其次,需要注意的是,缓存不会减少沿袭。整个谱系将作为代码生成的一部分进行分析和优化。唯一的区别是,由于将使用已经从缓存中具体化的数据,许多步骤可能会被跳过(顺便说一句,这并不总是正确的,在某些情况下,优化器可能会决定根据其内部启发法重新计算)。

有两种方法可以在数据帧上剪切沿袭。

  1. 写入磁盘并重新加载(这将沿袭到"读取"部分)
  2. 使用检查点(在后台也保存和加载)。

    检查点的优点是,您可以写入本地磁盘,而不是分布式磁盘(这应该需要更少的时间),然而,这是通过RDD完成的(即使是用于检查点数据帧的新接口实际上也在幕后直接使用RDD检查点),因此它比数据帧大小更大,这可能会导致它在实践中更慢。

最新更新