value avro不是org.apache.spark.sql.DataFrameReader

时间:2015-12-04 15:52:00

标签: hadoop apache-spark apache-spark-sql avro

我使用的是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文件的文档。

2 个答案:

答案 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._