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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了火花,在DataFrame(或RDD)上多次应用过滤器,而没有多余的评估相关的知识,希望对你有一定的参考价值。

我有一个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可能是一个解决方案,但在我的应用程序中不会,因为数据可能真的非常大。内存将溢出。

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

答案

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

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

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

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

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

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

以上是关于火花,在DataFrame(或RDD)上多次应用过滤器,而没有多余的评估的主要内容,如果未能解决你的问题,请参考以下文章

Spark中的迭代RDD / Dataframe处理

如何从整数 RDD 创建火花数据帧

Pyspark:从列表的 RDD 创建一个火花数据框,其中列表的某些元素是对象

如何使用火花流检查 rdd 是不是为空?

在所有 spark executors 和 Driver 上执行脚本或小函数,而不使用 DataFrame 或 RDD

火花检查点比缓存更快吗?