讀取 CSV 檔案
本文章提供使用 Python、Scala、R 和 SQL 透過 Azure Databricks 讀取和寫入 CSV 檔案的範例。
注意
Databricks 建議 SQL 使用者讀取 CSV 檔案 read_files 資料表值函式。 Databricks Runtime 13.3 LTS 和更新版本中提供 read_files
。
您也可以使用暫存檢視。 如果您使用 SQL 直接讀取 CSV 資料而不使用暫存檢視或 read_files
,則適用下列限制:
選項。
您可以為 CSV 檔案資料來源設定數個選項。 如需支援的讀取選項,請參閱下列 Apache Spark 參考文章。
本文僅涵蓋讀取 CSV,但您可以在下列 Apache Spark 參考文章中了解支援的寫入選項:
使用格式錯誤的 CSV 記錄
讀取具有指定結構描述的 CSV 檔案時,檔案中的資料可能不符合結構描述。 例如,包含城市名稱的欄位不會剖析為整數。 後果取決於剖析器在下列專案中執行的模式:
PERMISSIVE
(預設值):將在無法正確剖析的欄位插入 NullDROPMALFORMED
:卸除包含無法剖析之欄位的資料行FAILFAST
:如果找到任何格式錯誤的資料,則會中止讀取
若要設定模式,請使用 mode
選項。
diamonds_df = (spark.read
.format("csv")
.option("mode", "PERMISSIVE")
.load("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv")
)
在模式 PERMISSIVE
中,您可以使用下列其中一種方法來檢查無法正確剖析的資料列:
- 您可以提供自訂路徑至選項
badRecordsPath
以將損毀的記錄記錄到檔案中。 - 您可以將資料欄
_corrupt_record
新增至提供給 DataFrameReader 的結構描述,藉此檢閱結果 DataFrame 中的損毀記錄。
注意
選項 badRecordsPath
的優先順序高於 _corrupt_record
,這表示寫入所提供路徑的格式錯誤的資料列不會出現在產生的 DataFrame 中。
使用已修復的資料行時,格式錯誤的記錄的預設行為會變更。
尋找格式錯誤的資料列筆記本
已修復的資料行
注意
Databricks Runtime 8.3 (EoS) 和更新版本支援此功能。
使用 PERMISSIVE
模式時,您可以啟用已修復的資料欄來擷取未剖析的任何資料,因為記錄中的一個或多個欄位有下列其中一個問題:
- 不存在提供的結構描述。
- 不符合所提供結構描述的資料類型。
- 具有與所提供結構描述中欄位名稱不符的情況。
已修復的資料行會以 JSON 文件的形式傳回,其中包含已修復的資料行,以及記錄的來源檔案路徑。 若要從已修復的資料行中移除來源檔案路徑,您可以設定 SQL 組態 spark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")
。 您可以在讀取資料時將選項 rescuedDataColumn
設定為資料行名稱(例如使用 spark.read.option("rescuedDataColumn", "_rescued_data").format("csv").load(<path>)
的 _rescued_data
),以啟用已修復的資料行。
剖析記錄時,CSV 剖析器支援三種模式:PERMISSIVE
、DROPMALFORMED
和 FAILFAST
。 搭配使用 rescuedDataColumn
時,資料類型不符會導致記錄在 DROPMALFORMED
模式中捨棄或以 FAILFAST
模式擲回錯誤。 只有已損毀的記錄(也就是不完整或格式錯誤的 CSV)才會捨棄或擲回錯誤。
在 rescuedDataColumn
模式中使用 PERMISSIVE
時,下列規則會套用至損毀的記錄:
- 檔案的第一個資料列(標題列或資料列)會設定預期的資料列長度。
- 具有不同資料欄數目的資料列會被視為不完整。
- 資料類型不符會被視為損毀的記錄。
- 只有不完整和格式錯誤的 CSV 記錄會被視為損毀,並記錄到
_corrupt_record
資料欄或badRecordsPath
。
SQL 範例:讀取 CSV 檔案
下列 SQL 範例會使用 read_files
讀取 CSV 檔案。
-- mode "FAILFAST" aborts file parsing with a RuntimeException if malformed lines are encountered
SELECT * FROM read_files(
's3://<bucket>/<path>/<file>.csv',
format => 'csv',
header => true,
mode => 'FAILFAST')
Scala、R 和 Python 範例:讀取 CSV 檔案
下列筆記本示範如何使用 Scala、R 和 Python 讀取檔案、顯示範例資料,以及列印資料結構描述。 本章節中的範例會使用寶石資料集。 指定資料集的路徑,以及您想要的任何選項。
讀取 CSV 檔案筆記本
範例:指定結構描述
當 CSV 檔案的結構描述為已知時,您可以使用 schema
選項,將所需的結構描述指定給 CSV 助讀程式。
使用結構描述筆記本讀取 CSV 檔案
使用 read_files
的 SQL 範例:
SELECT * FROM read_files(
's3://<bucket>/<path>/<file>.csv',
format => 'csv',
header => false,
schema => 'id string, date date, event_time timestamp')
範例:讀取資料欄子集的錯誤
CSV 剖析器的行為取決於所讀取的資料欄集。 如果指定的結構描述不正確,結果可能會因為所存取的資料欄子集而有很大的差異。 下列筆記本呈現最常見的錯誤。