值 avro 不是 org.apache.spark.sql.DataFrameReader 的成员
Posted
技术标签:
【中文标题】值 avro 不是 org.apache.spark.sql.DataFrameReader 的成员【英文标题】:value avro is not a member of org.apache.spark.sql.DataFrameReader 【发布时间】:2015-12-04 15:51:59 【问题描述】:我正在使用 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 不适用于 Spark Avro 的 1.0 版本。
我尝试在网络上搜索,但找不到说明如何在 Spark Avro 1.0 上编写代码并能够解析 HDFS 上的 Avro 文件的文档。
【问题讨论】:
你添加了 import com.databricks.spark.avro._ 吗? 这是我的导入import org.apache.spark._ import com.databricks.spark.avro._ import org.apache.spark.sql.SQLContext import org.apache.spark.sql.DataFrameReader
还是同样的问题value avro is not a member of org.apache.spark.sql.DataFrameReader [error] val df = sqlConf.read.format("com.databricks.spark.avro").avro(path)
我不是说 .avro,而是 .load :)
是的,有效。很抱歉没有阅读您的答案。您能否将其报告为答案,以便我将其标记为答案?
【参考方案1】:
导入隐式转换也可以
import com.databricks.spark.avro._
【讨论】:
【参考方案2】:只需将该行替换为:
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(path,format) 的调用。根据API,自 1.4.0 起已弃用 - 使用 read.load(...)
。
【讨论】:
我将您的行更改为 sqlConf.read.format..... 因为当我读过()时,我看到了错误消息“错误:org.apache.spark.sql.DataFrameReader 没有取参数” @StevenMagana-Zook 谢谢 - 我更新了答案。我现在无法验证,所以我相信你的话:)以上是关于值 avro 不是 org.apache.spark.sql.DataFrameReader 的成员的主要内容,如果未能解决你的问题,请参考以下文章
为啥 kafka-avro-console-producer 不遵守该字段的默认值?