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 が存在しない場合、追加は既存のデータのパーティション分割に自動的に従います。

INSERT 構文はスキーマ強制を提供し、スキーマ進化をサポートします。 列のデータ型を Delta Lake テーブルのデータ型に安全にキャストできない場合は、ランタイム例外がスローされます。 スキーマ進化が有効になっている場合、スキーマを 進化させるためのスキーマ の最後の列 (またはネストされた列) として新しい列が存在する可能性があります。

Delta Lake マージ のスキーマ検証

merge INSERT 式と UPDATE 式によって生成されたデータのスキーマがテーブルのスキーマと互換性があることを自動的に検証します。 次の規則を使用して、 merge 操作に互換性があるかどうかを判断します。

  • update および insert アクションの場合、指定されたターゲットカラムがターゲット Delta テーブルに存在している必要があります。

  • updateAll アクションと insertAll アクションの場合、ソースデータセットにはターゲットDeltaテーブルのすべての列が含まれている必要があります。ソース データセットには追加の列を含めることができ、それらは無視されます。

  • すべてのアクションで、ターゲットカラムを生成する式によって生成されたデータ型がターゲット Delta テーブルの対応する列と異なる場合、 merge はそれらをテーブル内の型にキャストしようとします。

デルタレイクマージの自動スキーマ進化を参照してください。