次の方法で共有


CSV ファイルの読み取りと書き込み

この記事では、Python、Azure Databricks、R、SQL を使用して、CSV ファイルの読み取りと書き込みを行う例について説明します。

Note

Databricks では、SQL ユーザーが CSV ファイルを読み取る際に read_files テーブル値関数を使うことをお勧めします。 read_files は、Databricks Runtime 13.3 LTS 以降で使用できます。

一時ビューを使うこともできます。 一時ビューまたは read_files を使わずに、SQL を使って CSV データを直接読み取る場合は、次の制限が適用されます。

オプション

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 (サポート対象外) 以降でサポートされています。

PERMISSIVE モードを使用すると、復旧されたデータ列で、レコード内の 1 つ以上のフィールドに次のいずれかの問題があって解析されなかったデータをキャプチャできます。

  • 指定されたスキーマに存在しない。
  • 指定されたスキーマのデータ型と一致しない。
  • 指定されたスキーマのフィールド名と大文字と小文字の区別が一致しない。

復旧されたデータ列は、復旧された列と、レコードのソース ファイル パスを含む 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 の 3 つのモードがサポートされます。 rescuedDataColumn と共に使用すると、データ型の不一致によって、DROPMALFORMED モードでレコードが削除されたり、FAILFAST モードでエラーがスローされたりすることはありません。 削除されたり、エラーがスローされたりするのは、破損したレコード (不完全であるか形式に誤りがある CSV) だけです。

rescuedDataColumnPERMISSIVE モードで使用する場合、破損したレコードには次の規則が適用されます。

  • ファイルの最初の行 (ヘッダー行またはデータ行) で、予想される行の長さが設定されます。
  • 列数が異なる行は不完全と見なされます。
  • データ型の不一致は、破損したレコードとは見なされません。
  • 不完全で形式に誤りがある 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 を使って、ファイルの読み取り、サンプル データの表示、データ スキーマの印刷を行う方法を示しています。 このセクションの例では diamonds データセットを使います。 データセットへのパスと、必要なオプションを指定します。

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 パーサーの動作は、読み取られる列のセットによって異なります。 指定されたスキーマが正しくない場合、アクセスされる列のサブセットによっては結果が大きく異なる可能性があります。 次の notebook では、最も一般的な注意点を示しています。

CSV ファイル ノートブックの列のサブセットを読み取る際の注意事項

ノートブックを入手