Delta Lake のスキーマ検証
Delta Lake は、書き込んでいる DataFrame のスキーマがテーブルのスキーマと互換性があることを自動的に検証します。 Delta Lake は次のルールを使用して、DataFrame からテーブルへの書き込みに互換性があるかどうかを調べます。
- すべての DataFrame 列がターゲット テーブルに存在しなければなりません。 DataFrame の列がテーブルに存在しない場合は、例外が発生します。 テーブルには存在するけれども DataFrame には存在しない列は null に設定されます。
- DataFrame 列のデータ型が、ターゲット テーブルの列データ型と一致しなければなりません。 両者が一致しない場合は、例外が発生します。
- DataFrame 列名は、大文字小文字だけを変更しても区別されません。 つまり、"Foo" や "foo" などの列を同じテーブルに定義することはできません。 Spark を大文字/小文字区別モードや区別なし (既定) モードで 使用することはできますが、Parquet では列情報を格納したり返したりするとき、大文字/小文字が区別されます。 Delta Lake では大文字/小文字が維持されますが、スキーマを保管するときは区別がされず、この制限を維持することで潜在的なミス、データ破損、損失の問題を回避します。
Delta Lake では、新しい列を明示的に追加する DDL と、スキーマを自動的に更新する機能をサポートしています。
他のオプション (partitionBy
など) を、追加モードと組み合わせて指定すると、Delta Lake はそれらが一致することを検証し、不一致が発生した場合にエラーをスローします。 partitionBy
が存在しないとき、append が自動的に既存のデータのパーティション分割に従います。
注意
INSERT
構文がスキーマの適用を実現し、スキーマの展開をサポートします。 列のデータ型を Delta Lake テーブルのデータ型に安全にキャストできない場合は、ランタイム例外がスローされます。 スキーマの展開が有効になっている場合、新しい列は、展開するスキーマに対して、スキーマの最後の列 (または入れ子になった列) として存在する可能性があります。
Delta Lake マージのスキーマ検証
merge
は、挿入式と更新式によって生成されたデータのスキーマがテーブルのスキーマと互換性があることを自動的に検証します。 この場合、次の規則を使用して、merge
操作に互換性があるかどうかを判断します。
update
アクションとinsert
アクションでは、指定したターゲット列がターゲット Delta テーブルに存在する必要があります。updateAll
アクションとinsertAll
アクションの場合、ソース データセットには、ターゲット Delta テーブルのすべての列が必要です。 ソース データセットには追加の列を含めることができ、それらは無視されます。- すべてのアクションについて、ターゲット列を生成する式によって生成されたデータ型が、ターゲット Delta テーブル内の対応する列と異なる場合、
merge
はテーブル内の型へのキャストを試します。
「Delta Lake マージの自動スキーマの進化」を参照してください。