解决 Spark 中 org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus 转换错误
2024-03-23 12:02:42
解决 Spark 中 org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus 转换错误
问题概述
在使用 Apache Spark 创建 Delta 表时,你可能会遇到一个错误,提示无法将 org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus
类转换为 org.apache.spark.sql.execution.datasources.FileStatusWithMetadata
类。
成因分析
此错误通常是由以下原因引起的:
- Spark 版本不兼容
- 依赖关系问题
- 文件权限问题
- 临时故障
解决方法
解决此问题的步骤如下:
1. 确保 Spark 版本兼容
确保你使用的 Spark 版本与 Delta 版本兼容。对于 Delta 2.4.0,推荐使用 Spark 3.5.0。
2. 检查依赖项
检查你的项目依赖项中是否包含了正确的 Hadoop 和 Spark 库版本。确保它们是最新的,并且相互兼容。
3. 检查文件权限
确保你的 Spark 用户具有访问 Delta 表文件所需的权限。
4. 重试操作
有时,此错误可能是由于临时问题引起的。尝试重新运行创建 Delta 表的操作。
5. 使用绝对路径
在创建 Delta 表时,尝试使用绝对路径,而不是相对路径。
示例代码
下面是一个更新后的 Scala 代码示例,已解决版本问题并添加了绝对路径:
package com.scalaspark.app2
import org.apache.spark.sql.{Row, SparkSession}
object Main {
def main(args: Array[String]): Unit = {
val warehouseDir = "/Users/usr1/app2/scala-spark-app2/data_files/"
val spark = SparkSession.builder()
.appName("DeltaTableDetails")
.config("spark.master", "local")
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")
.config("spark.sql.warehouse.dir", warehouseDir)
.getOrCreate()
var query = "CREATE TABLE IF NOT EXISTS T1 (id bigint, data string) USING delta LOCATION '" + warehouseDir + "T1'"
spark.sql(query)
query = "INSERT INTO T1 VALUES(10,'VAL1')"
spark.sql(query)
}
}
结论
通过遵循上述步骤,你可以解决 org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus
转换错误,并成功创建 Delta 表。
常见问题解答
1. 为什么我仍然看到错误?
- 检查 Spark 和 Hadoop 日志以获取更多详细信息。
- 尝试使用 Spark Shell 来调试此问题。
2. 我需要使用什么 JDK 版本?
- 确保使用 JDK 20 或更高版本。
3. 我可以跳过检查依赖项吗?
- 不,依赖项检查对于确保兼容性和解决问题至关重要。
4. 是否需要重启 Spark 会话?
- 通常情况下,无需重启 Spark 会话。
5. 此错误是否会影响其他 Spark 操作?
- 此错误可能会影响涉及 Delta 表的任何 Spark 操作。