在scala方法之间传递Spark数据帧 - 性能

问题描述 投票:0回答:1

最近,我使用Scala和Spark开发了一个Spark Streaming应用程序。在这个应用程序中,我已经广泛使用了Implicit Class(Pimp my Library模式)来实现更多通用实用程序,例如通过创建一个扩展Spark的Dataframe的隐式类来将数据帧写入HBase。例如,

implicit class DataFrameExtension(private val dataFrame: DataFrame) extends Serializable { ..... // Custom methods to perform some computations }

但是,我团队的一位高级架构师重构了代码(指定一些样式不匹配和性能作为一个原因)并将这些方法复制到一个新类。现在,这些方法接受Dataframe作为参数。

任何人都可以帮助我,

  1. Scala的隐式类是否在运行时产生任何开销?
  2. 在方法调用或序列化方面,在方法之间移动数据对象是否会产生任何开销?
  3. 我搜索了一下,但找不到任何样式指南,它提供了使用隐式类或方法而非传统方法的指导。

提前致谢。

scala apache-spark apache-spark-sql implicit
1个回答
1
投票

Scala的隐式类是否在运行时产生任何开销?

不是你的情况。当隐式类型是AnyVal时(因此需要加框),会有一些开销。 Implicits在编译期间得到解决,除了可能有一些虚拟方法调用之外,应该没有开销。

在方法调用或序列化方面,在方法之间移动数据对象是否会产生任何开销?

不,不超过任何其他类型。显然不会有序列化。

...如果我在Spark代码中的方法之间传递数据帧,它可能会创建闭包,因此,将带来保存dataframe对象的父类。

仅当您在数据框中使用范围变量时,例如filter($"col" === myVar),其中myVar在方法范围内声明。在这种情况下,Spark可能会序列化包装类,但很容易避免这种情况。请记住,数据帧经常在Spark代码中传递,并且很可能在您可能正在使用的每个其他库中传递(例如,数据源)。

像你一样使用扩展隐式类是非常常见的(也很方便)。

© www.soinside.com 2019 - 2024. All rights reserved.