Google Dataproc Spark集群提交应用遇Parquet数据源冲突报错
解决Spark 3.1.1读取Hive数据时的Parquet数据源冲突问题
问题原因
尽管代码未直接调用Parquet API,但读取的Hive表底层大概率使用Parquet作为存储格式。Spark 3.x版本同时提供了Parquet的V1(org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat)和V2(org.apache.spark.sql.execution.datasources.v2.parquet.ParquetDataSourceV2)数据源实现,当Spark自动识别表存储格式时,会因找到多个匹配的数据源而触发冲突报错。
解决方案
1. 强制指定Parquet数据源版本
通过Spark配置强制使用单一版本的Parquet数据源,避免自动识别冲突:
- 代码中配置:初始化SparkSession时添加指定配置
val spark = SparkSession.builder() .appName("YourJobName") .config("spark.sql.sources.useV1SourceList", "parquet") // 强制使用V1数据源 // 或使用V2:.config("spark.sql.sources.useV2SourceList", "parquet") .enableHiveSupport() .getOrCreate() - 提交应用时配置:在
gcloud dataproc jobs submit spark命令中添加参数
优先推荐使用V1版本,因为3.1.1中V2数据源可能存在部分兼容性问题。gcloud dataproc jobs submit spark \ --cluster=your-cluster-name \ --class=com.your.package.MyJob \ --jars=your-jar-file.jar \ --conf spark.sql.sources.useV1SourceList=parquet
2. 修正Hive表的存储格式定义
检查并确保Hive表的元数据中明确指定Parquet存储格式:
- 若表未正确配置,执行ALTER语句修正:
该操作会更新表的元数据,明确指定使用Parquet存储格式,帮助Spark精准匹配数据源。ALTER TABLE your_hive_table SET FILEFORMAT PARQUET;
3. 排查Dataproc集群全局配置
检查Google Dataproc集群的Spark全局配置,确认是否存在覆盖默认数据源设置的配置项(例如集群初始化时添加的自定义conf),避免因全局配置导致V1和V2数据源同时被启用。
内容的提问来源于stack exchange,提问作者Piyush Shrivastava
相关产品推荐
相关产品推荐

