Delta Lake の照合サポート
Databricks Runtime 16.4 LTS 以降では、Delta Lake テーブルの文字列フィールドに照合順序を指定することで、大文字と小文字を区別しない照合やロケールを考慮した順序付けなど、列レベルでの文字列の比較とソート動作を制御できます。
照合の種類、命名規則、および優先順位の規則の詳細については、照合をご覧ください。
デフォルトでは、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を使用して、既存の列の照合順序を変更できます。
たとえば、列を大文字と小文字を区別しない照合順序に設定するには:
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE
例:列をデフォルトのバイナリ照合に復元する場合:
--
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に戻します。
まず、照合された各列に対してこのコマンドを実行してください。
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の値のみが照合をサポートします。