处理错误的记录和文件

Azure Databricks 提供了许多用于处理包含不良记录的文件的选项。 不良数据的示例包括:

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

使用 badRecordsPath

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

除了损坏的记录和文件,指示已删除的文件、网络连接异常、输入/输出异常等的错误将被忽略并记录在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 20170724T101153DataFrameReader 的创建时间。 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()

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