Delta Lake の照合サポート
Delta Lake のテーブルの文字列フィールドで照合を指定して、大文字と小文字を区別しない照合やロケールを考慮した順序付けを有効にするなど、文字列の比較と並べ替えの動作を制御できます。Databricks Runtime 16.4 LTS 以上が必要です。
照合の種類、命名規則、および優先順位の規則の詳細については、照合をご覧ください。
デフォルトでは、Delta Lake は文字列フィールドの照合順序を UTF8_BINARY に設定します。
照合を有効にすると、collations ライター テーブル機能が Delta Lake テーブルに追加されます。これにより、外部リーダーおよび他のプラットフォーム機能との互換性に影響します。本番運用テーブルで照合を有効にする前に、制限事項を参照してください。
照合を有効にしたテーブルを作成
新しいテーブルの作成時に、列レベルで照合を指定できます。照合は、最上位の文字列列およびネストされた型内の文字列フィールドに適用できます。
CREATE TABLE catalog.schema.my_table (
id BIGINT,
name STRING COLLATE UTF8_LCASE,
metadata STRUCT<label: STRING COLLATE UNICODE>,
tags ARRAY<STRING COLLATE UTF8_LCASE>,
properties MAP<STRING, STRING COLLATE UTF8_LCASE>
) USING delta
MAP キーは照合を使用できません。照合文字列に対応しているのは、MAPの値のみです。
既存のカラムの照合順序の変更
既存の列の照合順序は、ALTER TABLE を使用して変更できます。
-- Set a column to case-insensitive collation
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE
-- Revert a column to the default binary collation
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY
照合順序変更後に統計およびデータレイアウトを更新する
列の照合順序を変更しても、既存のデータが書き換えられたり、統計情報が更新されたりすることはありません。新しい照合順序では、クエリはすぐに正しい結果を返しますが、ファイルスキップとクラスタリングの効果は、以下のステップを実行するまでは低下する可能性があります:
- 列のファイルスキップ統計を更新:
ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
- テーブルでリキッドクラスタリングを使用している場合、クラスタリングレイアウトを書き換えます:
OPTIMIZE FULL my_table
- テーブルがZORDERを使用している場合、増分最適化を無効にし、すべてのファイルを書き換えてください。
SET spark.databricks.optimize.incremental = false;
OPTIMIZE my_table ZORDER BY zorder_column;
これらのステップをスキップしても、不正確な結果は発生しませんが、次の完全な書き換えまでヒストリカルデータに対するクエリパフォーマンスが低下する可能性があります。
Databricksでは、クエリー結果において常に照合順序が順守されます。
テーブルの照合を無効にする
照合テーブル機能を削除するには、まず、照合されたすべての列を UTF8_BINARY に戻してください:
-- Repeat for each collated column
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY
次に、テーブル機能を削除します。
ALTER TABLE my_table DROP FEATURE collations
Delta Lake テーブル機能の削除およびテーブル プロトコルのダウングレードを参照してください。
スキーマ進化と照合
スキーマ進化が、照合順序が指定された列を追加またはマージする場合、次の規則が適用されます。
- ターゲットテーブルにソース列が既に存在する場合、その列のターゲットテーブルの照合順序は保持されます。ソース列の照合順序は無視されます。
- ソース列が新規で照合順序が指定されている場合、ターゲットテーブルは新しい列にその照合順序を適用します。
- ターゲットテーブルに
collationsテーブル機能がまだ有効になっていない場合、照合された列を追加すると、それが自動的に有効になります。
制限事項:
以下の制限事項が、照合順序が有効になっているDelta Lakeテーブルに適用されます。
互換性と相互運用性:
- 外部のリーダーが
collationsテーブル機能を認識しない場合、UTF8_BINARYにフォールバックし、これにより誤った並べ替え順序や比較が生成される可能性があります。 - OpenSharingは、非デフォルト照合列での個々のパーティションの共有をサポートしていません。代わりにテーブルを共有してください。
- UniFormは、照合が有効なテーブルではサポートされていません。
- Databricks Runtime で認識されない照合順序が指定されている外部作成の Delta Lake テーブルは、クエリ時に例外をスローします。
- OSS Delta Lake APIs for Scala または Pythonでは照合はサポートしていません。Spark SQL または DataFrame APIs を使用してください。
クエリと特徴量の制限:
- 照合済みカラムは
CHECK制約では使用できません。 - 照合列はジェネレーテッドカラム式では参照できません。
- 照合順序指定列はブルームフィルタのインデックス (非推奨) と併用できません。
- 照合順序のある列は、構造化ストリーミングのステートフルクエリ(集計、結合、重複排除)では参照できません。
MAPキーは照合された文字列であってはなりません。MAPの値のみが照合をサポートします。