在 Scala 方法之间传递 Spark 数据帧 - 性能
Passing Spark dataframe between scala methods - Performance
最近,我使用 Scala 和 Spark 开发了一个 Spark Streaming 应用程序。在此应用程序中,我广泛使用隐式 Class(Pimp my Library 模式)来实现更通用的实用程序,例如通过创建扩展 Spark 数据帧的隐式 class 将数据帧写入 HBase。例如,
implicit class DataFrameExtension(private val dataFrame: DataFrame) extends Serializable { ..... // Custom methods to perform some computations }
但是,我团队的一位高级架构师重构了代码(指定一些样式不匹配和性能作为原因)并将这些方法复制到新的 class。现在,这些方法接受 Dataframe 作为参数。
任何人都可以帮助我,
- Scala 的隐式 classes 是否在
运行-时间?
- 在方法之间移动数据帧对象是否会产生任何开销,无论是在方法调用还是序列化方面?
- 我搜索了一下,但找不到任何风格指南来指导使用隐式 classes 或方法而不是传统方法。
提前致谢。
Whether Scala's implicit classes creates any overhead during run-time?
不是你的情况。当隐式类型为 AnyVal(因此需要装箱)时,会有 some 开销。隐含在编译时解决,除了可能有一些虚拟方法调用外,应该没有开销。
Does moving dataframe object between methods creates any overhead, either in terms of method calls or serialization?
不,不超过任何其他类型。显然不会连载
... if I pass dataframes between methods in Spark code, it might create closure and as a result, will bring the parent class that holds the dataframe object.
仅当您在数据框中使用范围变量时,例如 filter($"col" === myVar)
其中 myVar
在方法范围内声明。在这种情况下,Spark 可能 序列化包装 class,但很容易避免这种情况。请记住,数据帧在 Spark 代码中传递得非常频繁且非常深入,并且可能在您可能使用的所有其他库(例如数据源)中传递。
像您一样使用隐式扩展 classes 是很常见的(也很方便)。
最近,我使用 Scala 和 Spark 开发了一个 Spark Streaming 应用程序。在此应用程序中,我广泛使用隐式 Class(Pimp my Library 模式)来实现更通用的实用程序,例如通过创建扩展 Spark 数据帧的隐式 class 将数据帧写入 HBase。例如,
implicit class DataFrameExtension(private val dataFrame: DataFrame) extends Serializable { ..... // Custom methods to perform some computations }
但是,我团队的一位高级架构师重构了代码(指定一些样式不匹配和性能作为原因)并将这些方法复制到新的 class。现在,这些方法接受 Dataframe 作为参数。
任何人都可以帮助我,
- Scala 的隐式 classes 是否在 运行-时间?
- 在方法之间移动数据帧对象是否会产生任何开销,无论是在方法调用还是序列化方面?
- 我搜索了一下,但找不到任何风格指南来指导使用隐式 classes 或方法而不是传统方法。
提前致谢。
Whether Scala's implicit classes creates any overhead during run-time?
不是你的情况。当隐式类型为 AnyVal(因此需要装箱)时,会有 some 开销。隐含在编译时解决,除了可能有一些虚拟方法调用外,应该没有开销。
Does moving dataframe object between methods creates any overhead, either in terms of method calls or serialization?
不,不超过任何其他类型。显然不会连载
... if I pass dataframes between methods in Spark code, it might create closure and as a result, will bring the parent class that holds the dataframe object.
仅当您在数据框中使用范围变量时,例如 filter($"col" === myVar)
其中 myVar
在方法范围内声明。在这种情况下,Spark 可能 序列化包装 class,但很容易避免这种情况。请记住,数据帧在 Spark 代码中传递得非常频繁且非常深入,并且可能在您可能使用的所有其他库(例如数据源)中传递。
像您一样使用隐式扩展 classes 是很常见的(也很方便)。