Spark 1.2 SQL代码不适用于Spark 1.3 SQL代码

Ire*_*ene 3 sbt apache-spark apache-spark-sql

到目前为止,我已经在本地包目录中使用了这个build.sbt

name := "spark27_02"

version := "1.0"

scalaVersion := "2.10.4"

sbtVersion := "0.13.7"

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.2.1"

libraryDependencies += "org.apache.spark" %% "spark-streaming" % "1.2.1"

libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.2.1"

libraryDependencies += "org.apache.hadoop" % "hadoop-hdfs" % "2.5.0"
Run Code Online (Sandbox Code Playgroud)

我想试用刚出来的1.3.0版本,所以我使用了所有软件包的1.3.0版本.Spark编译,但SparkSQL没有编译,所以我检查了建议使用的MavenCentral

libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.3.0"
Run Code Online (Sandbox Code Playgroud)

但仍然没有工作.我从sbt shell做了更新.顺便说一下使用Scala 2.10.4

我做错了什么傻事?

任何帮助表示赞赏.

编辑引用此build.sbt的spark网页上的示例

name := "Marzia2"

version := "1.0"

scalaVersion := "2.10.4"

sbtVersion := "0.13.7"

libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.3.0"

libraryDependencies += "org.apache.spark" % "spark-streaming_2.10" % "1.3.0"

libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.3.0"
Run Code Online (Sandbox Code Playgroud)

sbt package 
Run Code Online (Sandbox Code Playgroud)

我明白了

[info] Compiling 1 Scala source to /home/cloudera/IdeaProjects/Marzia2/target/scala-2.10/classes...
[error] /home/cloudera/IdeaProjects/Marzia2/src/main/scala/prova_sql.scala:35: value createSchemaRDD is not a member of org.apache.spark.sql.SQLContext
[error]     import sqlContext.createSchemaRDD
[error]            ^
[error] /home/cloudera/IdeaProjects/Marzia2/src/main/scala/prova_sql.scala:38: value registerTempTable is not a member of org.apache.spark.rdd.RDD[prova_sql.Person]
[error]     people.registerTempTable("people")
[error]            ^
[error] two errors found
[error] (compile:compile) Compilation failed
Run Code Online (Sandbox Code Playgroud)

如果我使用像implicits定义spark上下文的新功能,我仍然会得到一个错误,它不是sparksql上下文的错误.

某处肯定会有一些愚蠢的错误.

Jus*_*ony 6

问题的一部分是SchemaRDD成为一个DataFrame.实际上,你应该使用

import sqlContext._
Run Code Online (Sandbox Code Playgroud)

而不是特定的导入,因为它将来会证明你反对隐式更改,但如果你真的想要,那么你可以使用

import sqlContext.implicits
Run Code Online (Sandbox Code Playgroud)

但是,第二部分是1.3.0破坏了兼容性,现在从API角度锁定,因此您现在需要执行以下操作:

  • 暗示并未完全被吹为1.2.为了使用它们,您现在必须:rdd.toDF().registerTempTable("xyz")

请注意 toDF

既然已经锁定了API,我就无法想到添加更直观implicit的方法.implicit对于导入的情况,最终会出现冲突的定义,sqlContext._并且scala中不支持嵌套的implicits.

迁移指南:

此外,隐式转换现在只使用方法toDF来增加由Products(即案例类或元组)组成的RDD,而不是自动应用.