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
オプションにカスタムパスを指定できます。 - データフレームReaderに提供されたスキーマに列
_corrupt_record
を追加して、結果のデータフレーム内の破損したレコードを確認できます。
badRecordsPath
オプションは _corrupt_record
よりも優先されます。つまり、指定されたパスに書き込まれた不正な形式の行は、結果のデータフレームには表示されません。
不正な形式のレコードのデフォルト動作は、 レスキューされたデータ列を使用すると変更されます。
不正な行ノートブックの検索
救出されたデータ列
この機能は、 Databricks Runtime 8.3 (EoS) 以降でサポートされています。
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パーサーは、レコードの解析時に PERMISSIVE
、 DROPMALFORMED
、および FAILFAST
の3つのモードで対応します。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 を使用してファイルの読み取り、サンプル データの表示、およびデータ スキーマの印刷を行う方法を示しています。 このセクションの例では、 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パーサーの動作は、読み取られる列のセットによって異なります。指定されたスキーマが正しくない場合、アクセスされる列のサブセットによって結果が大きく異なる可能性があります。次のノートブックは、最も一般的な落とし穴を示しています。