You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark 3.3.0升级后出现Multiple sources found异常求助

解决Spark 3.3.0 CSV/Parquet多数据源冲突问题

问题原因

Spark 3.3.0中同时保留了V1(org.apache.spark.sql.execution.datasources.csv.CSVFileFormat)和V2(org.apache.spark.sql.execution.datasources.v2.csv.CSVDataSourceV2)两类数据源实现,当Spark无法确定优先使用哪一类时,就会抛出"Multiple sources found"错误。你尝试显式指定全类名但报错,是因为代码中同时调用了format(...)和csv()方法——后者会自动绑定V1格式,导致冲突。

解决办法

1. 通过Spark配置指定默认数据源版本

在SparkSession初始化时添加配置,强制指定CSV/Parquet使用某一版本的数据源,无需修改依赖或代码结构:

import org.apache.spark.sql.SparkSession

val spark = SparkSession.builder()
  .appName("YourApp")
  .config("spark.sql.sources.useV1SourceList", "csv,parquet") // 强制使用V1数据源
  // 若偏好V2,替换为:.config("spark.sql.sources.useV2SourceList", "csv,parquet")
  .getOrCreate()

之后直接使用常规读取方式即可:

spark.read
  .option("header", "true")
  .option("delimiter", ",")
  .csv("/path/to/csv")

2. 修正代码调用方式(避免format与csv/parquet方法混用)

若想显式指定数据源类,不要同时调用format(...)和csv()/parquet()方法,改用load()加载文件:

// 使用V2数据源的正确写法
spark.read
  .format("org.apache.spark.sql.execution.datasources.v2.csv.CSVDataSourceV2")
  .option("header", "true")
  .option("delimiter", ",")
  .load("/path/to/csv") // 用load替代csv()

Parquet同理,替换为对应的全类名即可。

3. 检查并清理重复依赖

如果Maven依赖中存在重复的Spark数据源相关依赖(比如同时引入spark-sql_2.12:3.3.0和单独的spark-datasource-v2依赖),需清理冗余项。Spark 3.3.0的spark-sql已内置V2数据源实现,无需单独引入spark-datasource-v2,确保pom.xml中仅保留核心依赖:

<dependency>
  <groupId>org.apache.spark</groupId>
  <artifactId>spark-sql_2.12</artifactId>
  <version>3.3.0</version>
  <!-- 若其他依赖引入重复包,添加排除规则 -->
  <!--
  <exclusions>
    <exclusion>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-datasource-v2_2.12</artifactId>
    </exclusion>
  </exclusions>
  -->
</dependency>

内容的提问来源于stack exchange,提问作者praneethh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:39:52