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