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

时间:2015-03-17 17:08:23

标签: 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"

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

的MavenCentral
libraryDependencies += "org.apache.spark" % "spark-sql_2.10" % "1.3.0"

但仍无效。 我从sbt shell做了更新。 顺便说一下使用Scala 2.10.4

我做错了什么傻事?

感谢任何帮助。

EDIT 参考带有此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"

sbt package 

我得到了

[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

如果我在定义spark上下文时使用implicits之类的新功能,我仍然会收到与它有关的错误,而不是sparksql上下文的错误。

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

1 个答案:

答案 0 :(得分:6)

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

import sqlContext._

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

import sqlContext.implicits

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

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

请注意toDF

现在已经锁定了API,我想不出可以添加更直观的implicit的方法。对于导入的情况,您最终会遇到冲突的implicit定义{{1 scala中不支持嵌套的implicits。

来自migration guide

  

此外,隐式转换现在只会增加RDD   由产品(即案例类或元组)和方法组成   toDF,而不是自动申请。