处理错误记录和文件

Azure Databricks 提供了许多选项来处理包含错误记录的文件。 错误数据的示例包括:

  • 记录不完整或损坏:主要在基于文本的文件格式(如 JSON 和 CSV)中观察到。 例如,JSON 记录没有右大括号,或者 CSV 记录的列数不如 CSV 文件的标题或第一条记录。
  • 数据类型不匹配:当列的值没有指定的或推断的数据类型时。
  • 字段名称错误:当文件或记录中指定的列名的大小写与指定的或推断的架构不同时,所有文件格式都可能发生这种错误。
  • 文件损坏:如果无法读取文件,则可能是因二进制文件类型(例如 Avro、Parquet 和 ORC)中的元数据或数据损坏造成的。 在极少数情况下,可能是由底层存储系统中长期存在的暂时性故障引起的。
  • 文件缺失:文件在查询分析时被发现,但在处理时却不再存在。

使用 badRecordsPath

设置 badRecordsPath 时,指定路径记录到与数据加载过程中遇到的错误记录或文件相关的异常。

除了记录和文件受损外,指示文件被删除、网络连接异常、IO 异常等情况的错误都会被忽略并记录在 badRecordsPath 下。

注意

在基于文件的数据源中使用 badRecordsPath 选项有一些重要限制:

  • 它是非事务性的,可能会导致不一致的结果。
  • 暂时性错误被视为失败。

无法找到输入文件

val df = spark.read
  .option("badRecordsPath", "/tmp/badRecordsPath")
  .format("parquet").load("/input/parquetFile")

// Delete the input parquet file '/input/parquetFile'
dbutils.fs.rm("/input/parquetFile")

df.show()

在上面的示例中,由于 df.show() 无法找到输入文件,因此 Spark 会创建一个 JSON 格式的异常文件来记录该错误。 例如,/tmp/badRecordsPath/20170724T101153/bad_files/xyz 是异常文件的路径。 此文件位于指定的 badRecordsPath 目录 /tmp/badRecordsPath 下。 20170724T101153 是此 DataFrameReader 的创建时间。 bad_files 是异常类型。 xyz 是包含 JSON 记录的文件,其中有错误文件的路径和异常/原因消息。

输入文件包含错误记录

// Creates a json file containing both parsable and corrupted records
Seq("""{"a": 1, "b": 2}""", """{bad-record""").toDF().write.format("text").save("/tmp/input/jsonFile")

val df = spark.read
  .option("badRecordsPath", "/tmp/badRecordsPath")
  .schema("a int, b int")
  .format("json")
  .load("/tmp/input/jsonFile")

df.show()

在此示例中,数据帧只包含第一个可分析的记录 ({"a": 1, "b": 2})。 第二个错误记录 ({bad-record) 记录在异常文件中,该文件是 JSON 文件,位于 /tmp/badRecordsPath/20170724T114715/bad_records/xyz 中。 该异常文件包含错误记录、包含此记录的文件的路径,以及异常/原因消息。 找到异常文件后,可以使用 JSON 读取器来处理这些文件。