無効なレコードとファイルを処理する
Azure Databricks には、無効なレコードを含むファイルを処理するためのさまざまなオプションが用意されています。 無効なデータの例は次のとおりです。
- 不完全なレコードまたは破損したレコード: 主に JSON や CSV などのテキスト ベースのファイル形式で確認されます。 たとえば、右中かっこがない JSON レコードや、CSV ファイルのヘッダーまたは 1 番目のレコードと同じ数の列がない 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()
この例では、DataFrame に 1 番目の解析可能なレコード ({"a": 1, "b": 2}
) だけが含まれます。 2 番目の不良レコード ({bad-record
) は例外ファイルに記録されます。これは、/tmp/badRecordsPath/20170724T114715/bad_records/xyz
にある JSON ファイルです。 例外ファイルには、不良レコード、レコードが含まれるファイルのパス、例外または理由メッセージが含まれます。 例外ファイルを見つけたら、JSON リーダーを使用してそれらを処理できます。