最近,我使用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作为参数。
任何人都可以帮助我,
提前致谢。
Scala的隐式类是否在运行时产生任何开销?
不是你的情况。当隐式类型是AnyVal时(因此需要加框),会有一些开销。 Implicits在编译期间得到解决,除了可能有一些虚拟方法调用之外,应该没有开销。
在方法调用或序列化方面,在方法之间移动数据对象是否会产生任何开销?
不,不超过任何其他类型。显然不会有序列化。
...如果我在Spark代码中的方法之间传递数据帧,它可能会创建闭包,因此,将带来保存dataframe对象的父类。
仅当您在数据框中使用范围变量时,例如filter($"col" === myVar)
,其中myVar
在方法范围内声明。在这种情况下,Spark可能会序列化包装类,但很容易避免这种情况。请记住,数据帧经常在Spark代码中传递,并且很可能在您可能正在使用的每个其他库中传递(例如,数据源)。
像你一样使用扩展隐式类是非常常见的(也很方便)。