【问题标题】:SQLContext implicitsSQLContext 隐式
【发布时间】:2016-03-09 17:08:01
【问题描述】:

我正在学习 spark 和 scala。我精通java,但对scala不太了解。我正在阅读有关 spark 的教程,并遇到以下代码行,尚未解释:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._

sc 是 SparkContext 实例)

我知道 scala 隐式背后的概念(至少我想我知道)。有人可以向我解释上面的import 语句到底是什么意思吗? implicits 在实例化时绑定到 sqlContext 实例以及如何绑定?这些隐式是在 SQLContext 类中定义的吗?

编辑 以下似乎也适用于我(新代码):

val sqlc = new SQLContext(sc)
import sqlContext.implicits._

在上面的这段代码中。 sqlContext到底是什么,定义在哪里?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    来自ScalaDocsqlContext.implicits 包含“(Scala 特有的)Scala 中可用的隐式方法,用于将常见的 Scala 对象转换为 DataFrame。”

    并且在Spark programming guide中也有解释:

    // this is used to implicitly convert an RDD to a DataFrame.
    import sqlContext.implicits._
    

    例如,在下面的代码中,.toDF() 将不起作用,除非您将导入 sqlContext.implicits

    val airports = sc.makeRDD(Source.fromFile(airportsPath).getLines().drop(1).toSeq, 1)
        .map(s => s.replaceAll("\"", "").split(","))
        .map(a => Airport(a(0), a(1), a(2), a(3), a(4), a(5), a(6)))
        .toDF()
    

    什么隐式绑定到 sqlContext 实例时 实例化又如何?这些隐式是在 SQLContext 类中定义的吗?

    是的,它们是在 SqlContext 类中的对象 implicits 中定义的,该类扩展了 SQLImplicits.scala。看起来那里定义了两种类型的隐式转换:

    1. RDD 到 DataFrameHolder 的转换,可以使用上面提到的rdd.toDf()
    2. Encoder 的各种实例“用于将 T 类型的 JVM 对象与内部 Spark SQL 表示形式相互转换。”

    【讨论】:

    • 是的,但是sqlContext 是预定义的吗?我刚刚创建了上面 SQLContext 类的对象 sqlContext
    • 预定义的sqlContext是什么意思?
    • Spark API 中是否已经定义了 sqlContext 的版本,与上面定义的 sqlContext 不同?
    • 嗯,还有HiveContext,它扩展了SqlContext。如果您在谈论实际实例,那么不,没有其他实例,您必须创建自己的实例。
    • 我明白了。 SQL 上下文在 spark shell 中可用作 sqlContext。就像 SparkContext 实例可以作为 sc 使用一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2019-01-19
    • 2016-04-04
    • 1970-01-01
    • 2016-11-24
    • 2015-08-02
    相关资源
    最近更新 更多