Spark/Scala 中的隐式如何工作

Dat*_*eek 2 scala apache-spark

这是一个示例 Spark 代码,它将 转换SeqDataset

import spark.implicits._
val s = Seq(1, 2, 3, 4)
val ds = s.toDS()
Run Code Online (Sandbox Code Playgroud)

ScalaSeq没有该toDS方法,它来自 Spark 隐式。这里的数据集是如何创建的?

编辑:我确实查看了其他 SO 答案,但看不到一个示例,该示例将解释如何在s.toDS. 我在评论中引用了示例答案。

Tei*_*raz 6

Scala 有一种向现有类添加方法的方法,例如 Kotlin 中的扩展方法(我记得还有 C#),但它以不同的方式通过隐式实现。

要将方法添加到现有类,首先创建隐式类:

object StringImplicits {
  implicit class StringUtils(s: String) {
    def someCoolMethod = println("Yooo")
  }
}

object Application extends App {
    import StringImplicits._
    val s = "Hello"
    s.someCoolMethod
}
Run Code Online (Sandbox Code Playgroud)

你把这个StringUtils和可以调用someCoolMethod上的实例String

请注意,StringUtilsString作为构造函数参数。

在调用某个方法时String,scala 编译器首先在String类中。

如果它没有找到它,它将查找带String参数的导入的隐式类。

如果找到,它将调用该类中的方法。

如果没有找到这样的类,它将引发错误。