Your way is the way to go (see [1]). Even though I solved it a little different, the approach stays similar:
Possibility 1
Implicits
object ExtraDataFrameOperations {
object implicits {
implicit def dFWithExtraOperations(df: DataFrame) = DFWithExtraOperations(df)
}
}
case class DFWithExtraOperations(df: DataFrame) {
def customMethod(param: String) : DataFrame = {
// do something fancy with the df
// or delegate to some implementation
//
// here, just as an illustrating example: do a select
df.select( df(param) )
}
}
Usage
To use the new customMethod
method on a DataFrame
:
import ExtraDataFrameOperations.implicits._
val df = ...
val otherDF = df.customMethod("hello")
Possibility 2
Instead of using an implicit method
(see above), you can also use an implicit class
:
Implicit class
object ExtraDataFrameOperations {
implicit class DFWithExtraOperations(df : DataFrame) {
def customMethod(param: String) : DataFrame = {
// do something fancy with the df
// or delegate to some implementation
//
// here, just as an illustrating example: do a select
df.select( df(param) )
}
}
}
Usage
import ExtraDataFrameOperations._
val df = ...
val otherDF = df.customMethod("hello")
Remark
In case you want to prevent the additional import
, turn the object
ExtraDataFrameOperations
into an package object
and store it in in a file called package.scala
within your package.
Official documentation / references
[1] The original blog "Pimp my library" by M. Odersky is available at http://www.artima.com/weblogs/viewpost.jsp?thread=179766
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…