我是 Scala 的新手
这就是我想了解的内容
This code snippet gives me RDD[Int], not give option to use
toDF
var input = spark.sparkContext.parallelize(List(1,2,3,4,5,6,7,8,9))
但是当我导入
import spark.sqlContext.implicits._
时,它让我可以选择使用toDF
import spark.sqlContext.implicits._
var input = spark.sparkContext.parallelize(List(1,2,3,4,5,6,7,8,9)).toDF
所以我查看了源代码,
implicits
以SQLContext
的形式出现在object
类中。我无法理解,为什么RDD
实例在导入后能够调用toDF
?
任何人都可以帮助我理解吗?
更新
在 SQLContext 类中找到以下代码片段
object implicits extends SQLImplicits with Serializable {
protected override def _sqlContext: SQLContext = self
}
toDF
是一种扩展方法。通过导入,您可以为范围带来必要的暗示。
例如
Int
没有方法foo
1.foo() // doesn't compile
但是如果你定义一个扩展方法并导入隐式
object implicits {
implicit class IntOps(i: Int) {
def foo() = println("foo")
}
}
import implicits._
1.foo() // compiles
编译器将
1.foo()
转化为new IntOps(1).foo()
.
object implicits extends SQLImplicits ...
abstract class SQLImplicits ... {
...
implicit def rddToDatasetHolder[T : Encoder](rdd: RDD[T]): DatasetHolder[T] = {
DatasetHolder(_sqlContext.createDataset(rdd))
}
implicit def localSeqToDatasetHolder[T : Encoder](s: Seq[T]): DatasetHolder[T] = {
DatasetHolder(_sqlContext.createDataset(s))
}
}
https://docs.scala-lang.org/overviews/core/implicit-classes.html
https://docs.scala-lang.org/scala3/book/ca-extension-methods.html
https://docs.scala-lang.org/scala3/reference/contextual/extension-methods.html