Spark 读取 Avro 文件
Spark reading Avro file
我正在使用 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.apply(package.scala:34)
"com.databricks" %% "spark-avro" % "4.0.0"
列在我的依赖项中,它在我的外部库中。我还缺少其他依赖项吗?
查看 https://spark.apache.org/docs/latest/sql-data-sources-avro.html#deploying 以了解如何通过 spark-submit
命令将 Avro jar 与您的应用程序 jar 一起部署。具体来说,您需要使用 --packages
选项。这也适用于 spark-shell
.
事实证明我不必使用数据块 jar。我将 apache spark avro 添加到我的依赖项中:
"org.apache.spark" %% "spark-avro" % "2.4.0"
而且我能够将我的 avro 文件读入 DataFrame
:
val avroInput = sparkSession.read
.format("avro")
.load("/pathtoFile/avroFile.avro")
以下是在 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
在使用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
快乐学习!!
我正在使用 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.apply(package.scala:34)
"com.databricks" %% "spark-avro" % "4.0.0"
列在我的依赖项中,它在我的外部库中。我还缺少其他依赖项吗?
查看 https://spark.apache.org/docs/latest/sql-data-sources-avro.html#deploying 以了解如何通过 spark-submit
命令将 Avro jar 与您的应用程序 jar 一起部署。具体来说,您需要使用 --packages
选项。这也适用于 spark-shell
.
事实证明我不必使用数据块 jar。我将 apache spark avro 添加到我的依赖项中:
"org.apache.spark" %% "spark-avro" % "2.4.0"
而且我能够将我的 avro 文件读入 DataFrame
:
val avroInput = sparkSession.read
.format("avro")
.load("/pathtoFile/avroFile.avro")
以下是在 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
在使用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 快乐学习!!