import spark.sqlContext.implicits._ 如何在 scala 中工作?

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

我是 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 类中找到以下代码片段

https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/SQLContext.scala

  object implicits extends SQLImplicits with Serializable {
    protected override def _sqlContext: SQLContext = self
  }
scala apache-spark extension-methods implicit
1个回答
0
投票

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))
  }
}

理解 Scala 中隐含的

了解 Scala 隐式类

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

扩展类与隐式类有何不同?

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