Spark 读取 Avro 文件

cov*_*efe 2 scala avro apache-spark 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)
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试使用我的项目做同样的事情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)
Run Code Online (Sandbox Code Playgroud)

"com.databricks" %% "spark-avro" % "4.0.0"列在我的依赖项中,并且位于我的外部库中。我还缺少另一个依赖项吗?

NNK*_*NNK 5

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

Maven 依赖项。

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-avro_2.11</artifactId>
    <version>2.4.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

火花提交

使用spark-submit时,直接使用--packages提供spark-avro_2.12及其依赖项,例如,

./bin/spark-submit --packages org.apache.spark:spark-avro_2.12:2.4.4
Run Code Online (Sandbox Code Playgroud)

火花壳

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

./bin/spark-shell --packages org.apache.spark:spark-avro_2.12:2.4.4
Run Code Online (Sandbox Code Playgroud)

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

请参阅使用 Spark SQL 2.4.x 及更高版本中的 Avro 数据文件 快乐学习!