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 マージの自動スキーマの進化」を参照してください。