value avro不是org.apache.spark.sql.dataframereader的成员

ax6ht2ek  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(394)

我正在使用Cloudera5.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

因此,似乎github页面上的spark avro文档是针对版本2.0.1的,这些api不适用于版本1.0的spark avro。
我试图搜索网页,但我找不到文件,这将告诉我如何写在SparkAVRO1.0的代码,并能够解析在hdfs上的avro文件。

eqfvzcg8

eqfvzcg81#

导入隐式转换也有效

import com.databricks.spark.avro._
guykilcj

guykilcj2#

只需将该行替换为:

sqlConf.read.format("com.databricks.spark.avro").load(path)

原因是,正如您所说,您从spark avro的wiki复制/粘贴的代码适用于版本2.0.1。但是,如果您切换到github上的标记1.0.0(或您正在使用的版本),它将显示与该特定版本相关的所有数据—包括文档。
在这种特定的情况下,您将看到许多不同的方法来实现与您相同的功能,但其背后的原因是sparkapi也在发生变化。请记住,spark的发展非常快,因此您将在网上看到许多使用不同方法的示例,并且您将经常看到它们已经过时。
例如,在版本1.0.0的文档中,有对.load(路径,格式)的调用。根据api,自从1.4.0-使用以来,它就被弃用了 read.load(...) .

相关问题