值 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 的成员的主要内容,如果未能解决你的问题,请参考以下文章

spark.implicits._ 导入了啥?

Avro 字段默认值

联合字段的 Avro 无效默认值

为啥 kafka-avro-console-producer 不遵守该字段的默认值?

如何使用 Avro 生成 String 类型的字段而不是 CharSequence?

Kafka 的嵌套 Avro 类型是不是有最佳实践?