Spark读取Avro文件

时间:2018-12-10 23:40:42

标签: scala apache-spark avro spark-avro

我正在使用com.databricks.spark.avro。当我从spark-shell像spark-shell --jar spark-avro_2.11-4.0.0.jar这样运行它时,我可以通过执行以下操作来读取文件:

import org.apache.spark.sql.SQLContext
val sqlContext = new SQLContext(sc)
val avroInput = sqlContext.read.format("com.databricks.spark.avro").load(inputPath)
avroInput.write.format("com.databricks.spark.avro").save(outputPath)

但是如果我尝试使用sbt clean run从项目中执行相同的操作,则会得到:

java.lang.ClassNotFoundException: Failed to find data source: org.apache.spark.sql.avro.AvroFileFormat. Please find packages at http://spark.apache.org/third-party-projects.html
[info]   at org.apache.spark.sql.execution.datasources.DataSource$.lookupDataSource(DataSource.scala:657)
[info]   at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:194)
[info]   at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:178)
[info]   at com.databricks.spark.avro.package$AvroDataFrameReader$$anonfun$avro$2.apply(package.scala:34)

"com.databricks" %% "spark-avro" % "4.0.0"在我的依赖关系中列出,并且在我的外部库中。我还有其他依赖吗?

3 个答案:

答案 0 :(得分:1)

原来,我不必使用databricks jar。我将apache spark avro添加到了我的依赖项中:

"org.apache.spark"             %% "spark-avro"           % "2.4.0"

我能够将我的avro文件读入DataFrame

val avroInput = sparkSession.read
  .format("avro")
  .load("/pathtoFile/avroFile.avro")

答案 1 :(得分:1)

以下是在Spark中使用Avro时需要的依赖项。根据您的需要,使用以下之一。

Maven依赖项。

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-avro_2.11</artifactId>
    <version>2.4.0</version>
</dependency>

火花提交

使用spark-submit时,直接使用--packages(例如,

)提供spark-avro_2.12及其依赖项
./bin/spark-submit --packages org.apache.spark:spark-avro_2.12:2.4.4

火花壳

在使用spark-shell时,您还可以使用--packages直接添加spark-avro_2.12及其依赖项,

./bin/spark-shell --packages org.apache.spark:spark-avro_2.12:2.4.4

根据您使用的版本更改spark-avro版本。

引用Using Avro Data Files From Spark SQL 2.4.x and later 学习愉快!

答案 2 :(得分:0)

看看https://spark.apache.org/docs/latest/sql-data-sources-avro.html#deploying,了解如何通过spark-submit命令将Avro jar与应用程序jar一起部署。具体来说,您需要使用--packages选项。这也适用于spark-shell