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
相关产品推荐
相关产品推荐

