java - 烫 'multiple map()'优化

标签 java scala mapreduce cascading scalding

以下两个代码块在性能方面是否等效?

val input: TypedPipe[Person] = ....
input
  .map(_.getName)
  .map(_.split(" "))

还有...

val input: TypedPipe[Person] = ....
input
  .map(_.getName.split(" "))

具体来说,Scalding 是否会优化代码并始终对上面的两个片段执行单个仅映射作业?如果 map 函数比 getName/split 复杂得多怎么办?

IMO(对于更复杂的 map 函数)第一个示例更具可读性。但是,我担心这可能会导致运行时执行效率降低。

最佳答案

这两个函数不会在字节码/scalac层折叠,但更重要的是,烫伤总是会将它们折叠成hadoop中的单个map任务。事实上,所有类似 map 的运算符(map、flatMap、filter 等)都将被折叠到 1 个映射任务中,甚至折叠到一个reduce 任务的末尾。

因此,您的两个示例在 hadoop 中将具有相同的 DAG,唯一的区别是一些额外的函数调用开销。

与烫作业中进行的序列化/反序列化和 IO 相比,单独调用这些函数的开销不太可能成为性能瓶颈。热点虚拟机也有可能将其中一些 JIT 到 native 指令中。

我绝对建议提高可读性,除非您已经进行了大量分析并发现这是一个瓶颈(我会感到非常惊讶)。

关于java - 烫 'multiple map()'优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641474/

相关文章:

java - 在 Java 中为 Request 对象定义集合字段时,更好的做法是什么?

scala - 关闭 Slick 注销

scala - 如何简化 bool 元素的 foldLeft 操作?

java - 在 Mac OSX 上从 GitHub 编译 Scala 项目 - 加载 : net. java.games.input.OSXEnvironmentPlugin

mongodb - 根据 Mongodb Query 中的一个字段查找最大连续记录数

java - 是否存在 CombineParquetFileInputFormat?

java - 使用java在hadoop上运行mapreduce程序时出错

java - 服务器遇到内部错误,无法满足此请求

Java Android 不再有后台进程

java - 从数组列表中删除元素的更有效方法