CSVファイルの読み取り

この記事では、Python、Scala、R、および SQL を使用した Databricks での CSV ファイルの読み取りの例を示します。

注:

Databricksでは、SQLユーザーによるCSVファイルの読み込みにread_filesテーブル値関数を推奨しています。read_filesはDatabricks Runtime 13.3 LTS以降で使用できます。

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

オプション

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 オプションにカスタムパスを指定できます。

  • DataFrameReaderに提供されたスキーマに列 _corrupt_record を追加して、結果のDataFrame内の破損したレコードを確認できます。

注:

badRecordsPath オプションは _corrupt_recordよりも優先されます。つまり、指定されたパスに書き込まれた不正な形式の行は、結果のDataFrameには表示されません。

不正な形式のレコードに対するデフォルトの動作は、レスキューされたデータ列を使用する場合には変化します。

不正な形式の行の検索ノートブック

ノートブックを新しいタブで開く

レスキューされたデータ列

注:

この機能は、Databricks Runtime 8.3(サポート終了)以降のバージョンでサポートされています。

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

  • 指定されたスキーマに存在しない

  • 指定されたスキーマのデータ型と一致しない

  • 指定されたスキーマのフィールド名と大文字小文字の組み合わせが一致しない

レスキューされたデータ列は、レスキューされた列とレコードのソースファイルパスを含むJSONドキュメントとして返されます。レスキューされたデータ列からソースファイルパスを削除するには、 SQL構成にspark.conf.set("spark.databricks.sql.rescuedDataColumn.filePath.enabled", "false")を設定します。レスキューされたデータ列を有効にするには、 spark.read.option("rescuedDataColumn", "_rescued_data").format("csv").load(<path>)を使用した _rescued_data など、データを読み取るときにオプション rescuedDataColumn を列名に設定します。

CSVパーサーは、レコードの解析時に PERMISSIVEDROPMALFORMED、および FAILFASTの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 を使用してファイルを読み取り、サンプルデータを表示し、データスキーマを印刷する方法を示しています。このセクションの例では、ダイヤモンドデータセットを使用しています。データセットへのパスと、必要なオプションを指定してください。

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ファイル ノートブックの列のサブセットを読み取る際の注意事項

ノートブックを新しいタブで開く