分享方式:


讀取 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(預設值):將在無法正確剖析的欄位插入 Null
  • DROPMALFORMED:卸除包含無法剖析之欄位的資料行
  • 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 剖析器支援三種模式:PERMISSIVEDROPMALFORMEDFAILFAST。 搭配使用 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 剖析器的行為取決於所讀取的資料欄集。 如果指定的結構描述不正確,結果可能會因為所存取的資料欄子集而有很大的差異。 下列筆記本呈現最常見的錯誤。

讀取 CSV 檔案筆記本的資料欄子集警告

取得筆記本