首页 > 解决方案 > Spark过滤器+地图与flatMap

问题描述

在计算 RDD 时的 spark 中,我想知道例如我是否有一个 RDD[Either[A,B]] 并且我想获得 RDD[A] 和 RDD[B] 基本上我找到了两种方法:

  1. map+filter

    val rddA = rddEither.filter(_.isLeft).map(case Left(a) => a)
    val rddB = rddEither.filter(_.isRight).map(case Right(b) => b)
    
  2. flatMap

    val rddA = rddEither.flatMap { case Left(a) => Some(a) }
    val rddB = rddEither.flatMap { case Right(b) => Some(b) }
    

如果flatMap更高效?因为可能需要更少的计算?

还有其他问题 - 坚持 RDD 以加快执行速度是否好?我的意思是 rddEither,因为我将从该源开始计算 2 操作,或者 Spark 会处理这个问题?

标签: scalaapache-sparkpersistencerdd

解决方案


可能collect会更清楚一点。(也许会减少计算量,但我认为这不会对性能产生很大影响)

 val rddA = rddEither.collect { case Left(a) => a }
 val rddB = rddEither.collect { case Right(b) => b }

“还有其他问题:坚持 rdd 以加快执行速度好不好,我的意思是 rddEither 因为我将从该源开始计算 2 操作,或者 spark 会处理这个问题?”

Spark 不会处理这个问题,spark 是惰性的,这意味着对于每个操作,它将重新计算它需要给出结果的所有内容 - 除非某处有缓存。
但是,添加缓存并不一定会提高性能,因为如果您希望它更快,您只需将其保留在内存中,这可能会损害其他操作的性能,因为您的内存会更少。如果您将其保存在磁盘中以减少内存使用量,那么从磁盘读取反序列化数据所需的时间可能与重新计算原始RDD的时间相同或更长。因此,您可能需要对多个选项进行基准测试以确定哪个更好。

注意:是一篇关于 spark 内存管理的好文章,可能值得一读以调整缓存。


推荐阅读