返回

解决 Spark 中 org.apache.hadoop.fs.RawLocalFileSystem$DeprecatedRawLocalFileStatus 转换错误

java

解决 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 操作。