Spark SQL DataFrame/Dataset 执行引擎有几个非常有效的时间和空间优化(例如 InternalRow 和表达式 codeGen)。根据许多文档,对于大多数分布式算法来说,它似乎是比 RDD 更好的选择。
但是,我做了一些源代码研究,仍然不相信。我毫不怀疑 InternalRow 更紧凑,可以节省大量内存。但是算法的执行可能不会比保存预定义的表达式更快。也就是说,在 的源代码中指出 org.apache.spark.sql.catalyst.expressions.ScalaUDF
,每个用户定义的函数都会做 3 件事:
- 将催化剂类型(用于 InternalRow)转换为 scala 类型(用于 GenericRow)。
- 应用函数
- 将结果从 scala 类型转换回催化剂类型
显然,这甚至比直接在 RDD 上应用该函数而不进行任何转换还要慢。任何人都可以通过一些真实案例分析和代码分析来确认或否认我的猜测吗?
非常感谢您的任何建议或见解。