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