使用Scala Spark创建Delta表时出现ClassCastException异常
异常详情
创建Delta表时仓库已生成_delta_log目录,但执行插入操作时触发以下异常:
Exception in thread "main" java.lang.ClassCastException: class org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus cannot be cast to class org.apache.spark.sql.execution.datasources.FileStatusWithMetadata (org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus and org.apache.spark.sql.execution.datasources.FileStatusWithMetadata are in unnamed module of loader 'app')
问题分析
- JDK版本兼容性:Spark 3.5.0官方仅支持JDK 8和JDK 11,你使用的JDK 20不在支持范围内,会导致Hadoop文件系统相关类的加载异常。
- Scala版本不匹配:Spark 3.5.0推荐使用Scala 2.12.17或2.13.10,当前使用的Scala 2.12.4版本过旧,存在类兼容性问题。
- 潜在依赖冲突:未显式指定Hadoop依赖版本,可能导致与Spark自带的Hadoop组件版本不兼容。
解决方案
1. 调整JDK版本
将JDK切换为JDK 11(推荐)或JDK 8,确保符合Spark 3.5.0的官方支持要求。
2. 更新build.sbt配置
修改Scala版本,并添加兼容的Hadoop依赖,调整后的配置如下:
// 使用JDK 11或JDK 8 ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "2.12.17" // Spark 3.5.0推荐的Scala 2.12版本 lazy val root = (project in file(".")) .settings( name := "scala-spark-app2", idePackagePrefix := Some("com.scalaspark.app2"), ) // Spark依赖 libraryDependencies += "org.apache.spark" %% "spark-core" % "3.5.0" % Provided libraryDependencies += "org.apache.spark" %% "spark-sql" % "3.5.0" % Provided // Delta Lake依赖,与Spark 3.5.0兼容 libraryDependencies += "io.delta" %% "delta-core" % "2.4.0" // 添加兼容的Hadoop依赖 libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "3.3.4" % Provided
注:添加
Provided标记是因为Spark集群环境通常自带这些依赖,本地运行时可根据情况移除。
3. 清理旧数据目录
删除已生成的/Users/usr1/scala-spark-app2/data_files/T1目录,避免残留的旧_delta_log导致异常。
4. 验证代码
保持Main.scala代码不变,重新运行程序,确认异常是否解决。
内容的提问来源于stack exchange,提问作者Sarthak Sharma

