我创建了一个指向具有镶木地板存储的 Azure ADLS 的外部表,在将数据插入该表时,出现以下错误。我正在使用 Databricks 来执行
org.apache.spark.sql.AnalysisException: Multiple sources found for parquet (org.apache.spark.sql.execution.datasources.v2.parquet.ParquetDataSourceV2, org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat), please specify the fully qualified class name.;
昨天工作得很好,从今天开始我开始收到这个错误。
我在互联网上找不到任何关于为什么会发生这种情况的答案。
如果您想要一种无需清理依赖项的解决方法。以下是选择源之一的方法(以“org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat”为例):
更换:
spark.read.parquet("<path_to_parquet_file>")
与
spark.read.format("org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat").load("<path_to_parquet_file>")
spark/jars/ 目录中可能有超过 1 个 jar 文件,例如 - Spark-sql_2.12-2.4.4和spark-sql_2.12-3.0.3可能会导致多类问题。
此问题已修复,错误的原因是,我们使用 uber jar 安装了 Azure 提供的 Spark sqldb 连接器,该连接器还依赖于 parquet 文件格式化程序。
我也遇到过类似的问题,是Jar包依赖冲突引起的。我使用 maven 将 Spark jar 与 maven-shade-plugin 一起打包,该插件排除了冲突的 jar。这对我有用。
这是pom.xml的代码
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.0</version>
<configuration>
<artifactSet>
<excludes>
<exclude>org.scala-lang:*:*</exclude>
<exclude>org.apache.spark:*:*</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<finalName>spark_anticheat_shaded</finalName>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
您可能正在使用spark2,而jar中的依赖项正在使用spark3。
确保您的 jar 中的依赖项和您正在使用的 Spark 版本之间的 Spark 版本保持一致。
您可以使用以下命令检查在 scala 中运行的 Spark 版本:
import org.apache.spark.sql.SparkSession
val spark: SparkSession = SparkSession.builder().appName("Spark Version Checker").getOrCreate()
val version: String = spark.version
println(s"Spark version: $version")
然后,根据您的构建工具,您也许能够调查依赖项工具中可用的 jar。如果您使用 Buck 或 bazel,您可以使用以下方法调查构建目标的依赖关系:
buck query "deps(target)" > dependencies.list
然后查看 dependency.list 以识别 jar 中存在的 Spark 版本。
对我来说,这个问题发生在 EMR 上。此错误表明 Spark 正在查找多个可用于读取 Parquet 文件的类,并且无法自动决定使用哪一个。
在 pom.xml 中将范围更改为 provided 后,我的问题得到解决。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
<scope>provided</scope>
</dependency>
这个问题也可以通过
spark.read.format("org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat").load("<path_to_parquet_file>")
解决,但是如果你有多个读取语句,则需要在代码库中的多个位置进行更改。