我使用的是cloudera 5.4.1和spark 1.3.0
我写了这段代码
val path = "/input/"
val conf = new SparkConf()
.setAppName("Form Submissions")
val sc = new SparkContext(conf)
val sqlConf = new SQLContext(sc)
val df = sqlConf.read.avro(path)
df.foreach(println)
这是我的sbt文件
name := "SparkAvro"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies ++= Seq(
//"org.apache.spark" % "spark-core_2.10" % "1.2.0",
"org.apache.spark" % "spark-core_2.10" % "1.5.2" % "provided",
"org.apache.spark" % "spark-sql_2.10" % "1.5.2" % "provided",
"com.databricks" % "spark-avro_2.10" % "1.0.0"
)
mainClass in assembly := Some("com.abhi.SparkAvro")
当我构建此项目时,它失败并显示此错误消息
[error] /Users/ab/MyProjects/SparkAvro/src/main/scala/com/abhi/SparkAvro.scala:17:
value avro is not a member of org.apache.spark.sql.DataFrameReader
[error] val df = sqlConf.read.avro(input)
[error] ^
[error] one error found
因此,似乎Spark Avro的github页面上的文档适用于版本2.0.1,而这些API不适用于1.0版本的Spark Avro。
我尝试在网上搜索但是找不到能够在Spark Avro 1.0上编写代码并能够在HDFS上解析Avro文件的文档。
答案 0 :(得分:1)
只需用以下代码替换该行:
sqlConf.read.format("com.databricks.spark.avro").load(path)
原因在于,正如您所说,您从spark-avro的wiki复制/粘贴的代码是针对版本2.0.1的。但是,如果您在github上切换到标记1.0.0(或您正在使用的版本),它将显示与该特定版本相关的所有数据 - 包括文档。
在这种特定情况下,您将看到一些不同的方法来做同样的事情,但其背后的原因是Spark API也在发生变化。请记住,Spark的移动速度非常快,所以你会在网上看到很多使用不同方法的例子 - 你会经常看到它们已经过时了。
例如,在1.0.0版的文档中,调用了.load(路径,格式)。根据{{3}},自1.4.0以来已弃用 - 使用read.load(...)
。
答案 1 :(得分:1)
导入隐式转换也有效
import com.databricks.spark.avro._