读取或写入 Parquet 格式数据时出错

问题描述 投票:0回答:6

我创建了一个指向具有镶木地板存储的 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.;

昨天工作得很好,从今天开始我开始收到这个错误。

我在互联网上找不到任何关于为什么会发生这种情况的答案。

apache-spark parquet databricks azure-databricks
6个回答
2
投票

如果您想要一种无需清理依赖项的解决方法。以下是选择源之一的方法(以“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>")


2
投票

spark/jars/ 目录中可能有超过 1 个 jar 文件,例如 - Spark-sql_2.12-2.4.4和spark-sql_2.12-3.0.3可能会导致多类问题。


1
投票

此问题已修复,错误的原因是,我们使用 uber jar 安装了 Azure 提供的 Spark sqldb 连接器,该连接器还依赖于 parquet 文件格式化程序。


0
投票

我也遇到过类似的问题,是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>

0
投票

您可能正在使用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 版本。


0
投票

对我来说,这个问题发生在 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>")
解决,但是如果你有多个读取语句,则需要在代码库中的多个位置进行更改。

© www.soinside.com 2019 - 2024. All rights reserved.