火花,在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
可能是一个解决方案,但在我的应用程序中不会,因为数据可能真的非常大。内存将溢出。
有什么天才:)谁可以提出另一种绕过冗余评估的方法?
答案
这实际上是每天在我们集群中发生的一种情况。根据我们的经验,这种方法最适合我们。
[当我们需要两次使用相同的计算数据帧(在不同分支上时,我们如下:
计算阶段很繁重,导致数据帧很小->将其缓存。
[计算阶段较轻,导致数据框很大->让它进行两次计算。
计算量大,导致大数据帧->将其写入磁盘(HDFS或S3),将分割点上的分割工作分割为两个不同的批处理作业。在这种情况下,您无需重复繁琐的计算,也不必粉碎缓存(这两种方式都可能会使用磁盘)。
计算阶段较轻,导致数据框较小。你的生活很好,你可以回家:)。
以上是关于火花,在DataFrame(或RDD)上多次应用过滤器,而没有多余的评估的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark:从列表的 RDD 创建一个火花数据框,其中列表的某些元素是对象