scala - Spark过滤器+地图与flatMap
问题描述
在计算 RDD 时的 spark 中,我想知道例如我是否有一个 RDD[Either[A,B]] 并且我想获得 RDD[A] 和 RDD[B] 基本上我找到了两种方法:
map
+filter
val rddA = rddEither.filter(_.isLeft).map(case Left(a) => a) val rddB = rddEither.filter(_.isRight).map(case Right(b) => b)
flatMap
val rddA = rddEither.flatMap { case Left(a) => Some(a) } val rddB = rddEither.flatMap { case Right(b) => Some(b) }
如果flatMap更高效?因为可能需要更少的计算?
还有其他问题 - 坚持 RDD 以加快执行速度是否好?我的意思是 rddEither,因为我将从该源开始计算 2 操作,或者 Spark 会处理这个问题?
解决方案
可能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 内存管理的好文章,可能值得一读以调整缓存。
推荐阅读
- python - Pydev 无法使用 anaconda 加载 numpy
- mysql - 此页面无法正常工作。mydomain.com 响应时间过长。HTTP 错误 504,mysql grails
- xcode - 在 React Native 中为每个方案设置 babel ios bundle build 的环境变量
- c# - Unity 中 set active 和 Input.touch 中的故障
- amazon-web-services - Terraform - 为安全组迭代和创建入口规则
- asp.net-core - 我使用 HttpGet 和 HttpPost 错了吗?ASP.NET C#
- mean-stack - Mac 上的 Bitnami MEAN 堆栈:未知命令表达
- xml - 对安全性 ODOO 13 的分组访问
- python - Pyspark 数据框连接很少有重复的列名,很少有没有重复的列
- java - 为什么 Object 类有方法 wait() 和 notify() 而 Class 类没有?