向(Py)Spark数据帧添加.cache()会忽略.limit()并缓存完整的数据帧

时间:2019-10-14 17:10:13

标签: python apache-spark pyspark

我正在为非常大的数据帧编写管道。为了快速原型化,我尝试从数据帧中缓存少量样本。

我的期望是,我可以通过执行以下代码来有效地实现这一目标。

df.limit(1).cache().collect()

但是,如下图所示,这将创建两个阶段,第一个阶段将缓存整个数据帧(玩具示例为99.3gb)。

Spark stages with cache()

这令人惊讶,因为当我删除缓存方法(离开df.limit(1).collect())时,spark产生了一个收集阶段,该收集阶段仅应用于数据帧中的单个分区。参见下面的图片。

Spark stages without cache()

比较限制与显示/收集/获取(具有一个分区的阶段)与计数(具有完整数据帧的阶段)组合的阶段时,也会观察到相同的差异。

尽管我可以通过手动过滤单个分区来加快缓存的速度,但是我仍然遇到以下两个问题:

  1. 从大型数据框中缓存数据样本的最有效方法是什么?
  2. 当对查询施加限制时,为什么.cache()会缓存整个数据帧,而没有cache()的同一查询却不会触及整个数据帧?

0 个答案:

没有答案