火花,在DataFrame(或RDD)上多次应用过滤器,而没有多余的评估

问题描述 投票:2回答:1

我有一个Spark DataFrame,需要对父RDD的链接进行大量评估。

val df: DataFrame[(String, Any)] = someMethodCalculatingDF()
val out1 = df.filter(_._1 == "Key1").map(_._2).collect()
val out2 = df.filter(_._1 == "Key2").map(_._2)

out1是非常小的数据(每个分区一个或两行),并已收集以备后用。out2是一个数据帧,将用于生成另一个RDD,稍后再实现。因此,df将被评估两次,这很重。

Caching可能是一个解决方案,但在我的应用程序中不会,因为数据可能真的非常大。内存将溢出。

有什么天才:)谁可以提出另一种绕过冗余评估的方法?

scala apache-spark lazy-evaluation
1个回答
0
投票

这实际上是每天在我们集群中发生的一种情况。根据我们的经验,这种方法最适合我们。

[当我们需要两次使用相同的计算数据帧(在不同分支上时,我们如下:

  1. 计算阶段很繁重,导致数据帧很小->将其缓存。

  2. [计算阶段较轻,导致数据框很大->让它进行两次计算。

  3. 计算量大,导致大数据帧->将其写入磁盘(HDFS或S3),将分割点上的分割工作分割为两个不同的批处理作业。在这种情况下,您无需重复繁琐的计算,也不必粉碎缓存(这两种方式都可能会使用磁盘)。

  4. 计算阶段较轻,导致数据框较小。你的生活很好,你可以回家:)。

© www.soinside.com 2019 - 2024. All rights reserved.