處理不良記錄和文件

從基於文件的數據源讀取數據時,Apache Spark SQL會遇到兩種典型的錯誤情況。首先,文件可能不可讀(例如,它們可能丟失、無法訪問或損壞)。第二,即使文件是可處理的,有些記錄可能是不可解析的(例如,由於語法錯誤和模式不匹配)。

Databricks提供了一個統一的接口,在不中斷Spark作業的情況下處理不良記錄和文件。通過設置數據源選項,您可以從異常日誌中獲取異常記錄/文件和原因badRecordsPathbadRecordsPath指定異常文件的存儲路徑,用於記錄CSV和JSON源的壞記錄信息,以及所有基於文件的內置源(如Parquet)的壞文件信息。

此外,在讀取文件時,可能會出現網絡連接異常、IO異常等瞬時錯誤。這些錯誤將被忽略,並記錄在badRecordsPath, Spark將繼續運行這些任務。

請注意

使用badRecordsPath選項在基於文件的數據源中有一些重要的限製:

  • 它是非事務性的,可能導致不一致的結果。

  • 瞬時誤差被視為故障。

例子

無法找到輸入文件

瓦爾df火花選項“badRecordsPath”“/ tmp / badRecordsPath”格式“鋪”).負載“/輸入/ parquetFile”//刪除輸入parquet文件'/input/parquetFile'dbutilsfsrm“/輸入/ parquetFile”df顯示()

在上麵的例子中,sincedf.show ()如果無法找到輸入文件,Spark會創建一個JSON格式的異常文件來記錄錯誤。例如,/ tmp / badRecordsPath / 20170724 t101153 / bad_files / xyz異常文件的路徑。該文件在指定的badRecordsPath目錄,/ tmp / badRecordsPath20170724 t101153這是創造時間嗎DataFrameReaderbad_files是異常類型。xyz是一個包含JSON記錄的文件,其中包含錯誤文件的路徑和異常/原因消息。

輸入文件包含錯誤記錄

//創建一個包含可解析記錄和已損壞記錄的json文件Seq"{"a": 1, "b": 2}""" "{不良記錄“”“”).toDF()。格式“文本”).保存“/ tmp /輸入/ jsonFile”瓦爾df火花選項“badRecordsPath”“/ tmp / badRecordsPath”模式"a int, b int"格式“json”負載“/ tmp /輸入/ jsonFile”df顯示()

在本例中,DataFrame隻包含第一個可解析記錄({“a”:1,“b”:2}).第二個壞記錄({不良記錄)記錄在異常文件中,該文件是一個JSON文件,位於/ tmp / badRecordsPath / 20170724 t114715 / bad_records / xyz.異常文件包含壞記錄、包含該記錄的文件的路徑以及異常/原因消息。定位異常文件後,可以使用JSON閱讀器處理它們。