SQLContext隐式转换

6

我正在学习Spark和Scala。我精通Java,但对Scala不是很熟悉。我正在学习Spark的教程,遇到了下面这行代码,但它还没有被解释:

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

sc是SparkContext实例)
我知道scala implicits背后的概念(至少我认为我知道)。有人能解释一下上面的import语句到底意味着什么吗?当实例化sqlContext时,哪些implicits与之绑定,以及如何绑定?这些隐式定义在SQLContext类内部吗? 编辑 以下内容对我也有效(新代码):
val sqlc = new SQLContext(sc)
import sqlContext.implicits._

在上面的代码中,sqlContext是什么,它在哪里定义的?
1个回答

5

来自ScalaDoc: sqlContext.implicits包含“(Scala-specific) Scala中可用的隐式方法,用于将常见的Scala对象转换为DataFrames。”

并且在Spark编程指南中也有解释:

// 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类内部的object "implicits"中定义的,该类扩展了SQLImplicits.scala。看起来在那里定义了两种类型的隐式转换:
1. RDD到DataFrameHolder的转换,使得可以使用上述提到的rdd.toDf()
2. Encoder的各种实例,用于将T类型的JVM对象转换为内部Spark SQL表示形式,并从中进行转换。

是的,但是 sqlContext 是预定义的吗?我刚刚在上面创建了一个 SQLContext 类的对象 sqlContext - Ankit Khettry
sqlContext 预定义是什么意思? - vitalii
Spark API中是否已经定义了一个版本的sqlContext,与上面正在定义的sqlContext不同? - Ankit Khettry
我明白了。在Spark shell中,SQL上下文可用作sqlContext。就像SparkContext实例可用作sc一样。 - Ankit Khettry
让我们在聊天中继续这个讨论 - Ankit Khettry
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接