外部テーブルのパーティション検出
この記事では、Unity Catalog 外部テーブルに対する既定のパーティション検出戦略を説明するとともに、パーティション検出を Hive メタストアに整合させるためのパーティション メタデータ ログを有効にするオプション設定について説明します。
Databricks は、パーティションを持つ Unity Catalog 外部テーブルの読み取り速度とクエリ パフォーマンス向上のためにパーティション メタデータ ログを有効にすることを推奨しています。
Unity Catalog の既定のパーティション検出戦略とは
既定では、Unity Catalog はテーブルの場所にあるすべてのディレクトリを再帰的にリストすることによって自動的にパーティションを検出します。 多数のパーティション ディレクトリを持つ大規模なテーブルの場合は、これを行うことによって多くのテーブル操作の待機時間が長くなる可能性があります。
パーティション メタデータ ログを使用する
重要
この機能はパブリック プレビュー段階にあります。
Databricks Runtime 13.3 LTS 以上では、必要に応じてパーティション メタデータ ログを有効にすることができます。これは Unity Catalog に登録されている外部テーブルに対するパーティション検出戦略の 1 つです。 この動作は、Hive メタストアで使用されるパーティション検出戦略と整合しています。 この動作の影響を受けるのは、Unity Catalog の外部テーブルのうち、パーティションがあり、かつ Parquet、ORC、CSV、または JSON を使用するもののみです。 Databricks は、このようなテーブルの読み取り速度とクエリのパフォーマンスを向上させるために新しい動作を有効にすることを推奨しています。
重要
パーティション メタデータ ログが有効化されているテーブルでは、パーティション検出の動作が変化します。 テーブルの場所を自動的にスキャンしてパーティションを見つけるのではなく、パーティション メタデータに登録されているパーティションのみが Unity Catalog によってパーティションとして認識されます。 「パーティション メタデータを手動で追加、削除、または修復する」を参照してください。
この動作は、Databricks Runtime の将来のバージョンで既定になる予定です。 この機能が有効になっているテーブルの読み取りと書き込みができるのは、Databricks Runtime 13.3 LTS 以上を使用する場合のみです。
Note
Databricks Runtime 12.2 LTS 以下でテーブルに対するクエリを試してみて、この新しいパーティション ログの動作が使用されていないことを確認してください。
パーティション メタデータ ログを有効にする
テーブルでのパーティション メタデータ ログを有効にするには、現在の SparkSession に対して Spark conf を有効にしてから外部テーブルを作成する必要があります。 この設定が必要になるのは、テーブルを作成する SparkSession 内のみです。 パーティション メタデータ ログを有効にしてテーブルを作成すると、この設定がテーブル メタデータの一部として永続化され、それ以降のすべてのワークロードでこの機能が使用されます。
次の構文は、SQL を使用してノートブック内で Spark conf を設定する方法を示しています。 Spark 構成の設定は、コンピューティングを構成するときに行うこともできます。
SET spark.databricks.nonDelta.partitionLog.enabled = true;
重要
パーティション メタデータ ログが有効になっているテーブルの読み取りと書き込みができるのは Databricks Runtime 13.3 LTS 以上のみです。 Databricks Runtime 12.2 LTS 以下で実行されるワークロードがテーブルと相互作用する必要がある場合は、この設定を使用しないでください。
外部テーブルを削除しても、基になるデータ ファイルは削除されません。 Databricks は、次の例のように CREATE OR REPLACE
構文を使用してパーティション メタデータ ログを使用するようにテーブルをアップグレードすることを推奨しています。
CREATE OR REPLACE TABLE <catalog>.<schema>.<table-name>
USING <format>
PARTITIONED BY (<partition-column-list>)
LOCATION 'abfss://<bucket-path>/<table-directory>';
Unity Catalog によって、パス重複に関するルールがテーブルとボリュームに適用されます。 データ ファイルのコレクションに基づく新しい Unity Catalog テーブルを登録するときに、その場所に既にテーブルが存在する場合は登録はできません。
パーティション メタデータを持つテーブルでの作業を行う
Databricks は、Unity Catalog に登録されているすべてのテーブルに対するすべての読み取りと書き込みでテーブル名を使用することを推奨しています。 このようにすると、テーブルにパーティション メタデータがある場合に、テーブルに追加される新しいパーティションが確実に Unity Catalog に登録されるとともに、テーブルに対するクエリの実行時に登録済みのすべてのパーティションが読み取られることが保証されます。
パスに基づくパターンを読み取りまたは書き込みに使用すると、パーティションが無視されることや、Unity Catalog メタストアに登録されなくなることがあります。 「制限事項」を参照してください。
パーティションのリストを作成する
次のコマンドを使用すると、Unity Catalog にパーティション メタデータとして登録されているすべてのパーティションが表示されます。
SHOW PARTITIONS <table-name>
ある 1 つのパーティションが Unity Catalog に登録されているかどうかを確認するには、次のコマンドを使用します。
SHOW PARTITIONS <table-name>
PARTITION (<partition-column-name> = <partition-column-value>)
パーティション メタデータを手動で追加、削除、または修復する
Unity Catalog では、外部テーブルのすべてのパーティションが、テーブル登録時に LOCATION
句を使用して登録されたディレクトリ内に収容されていることが求められます。
パーティション メタデータが有効化されているときは、テーブルの場所にあるパーティションの自動検出が無効になります。 外部システムによってテーブルの場所にデータが書き込まれる場合や、テーブル内のレコードの追加または上書きにパスベースの書き込みを使用する場合は、パーティション メタデータを手動で修復する必要があります。
Azure Databricks では、Parquet、ORC、CSV、JSON をベースとするテーブルの格納に Hive スタイルのパーティション分割が使用されます。 Hive スタイルのパーティションでは、たとえば year=2021/month=01/
のように、パーティション ディレクトリの中に等号で接続されたキーと値のペアがあります。
テーブルで Hive スタイルのパーティション分割を使用している場合は、MSCK REPAIR
を使用して Unity Catalog 内のパーティション メタデータとテーブルの場所に存在するパーティションとを同期できます。 次の構文の例は、一般的な操作を示しています。
-- Add and remove parition metadata to match directories in table location
MSCK REPAIR TABLE <table_name> SYNC PARTITIONS;
-- Add partitions in the table location that are not registered as partition metadata
MSCK REPAIR TABLE <table_name> ADD PARTITIONS;
-- Drop partitions registered as partition metadata that are not in the table location
MSCK REPAIR TABLE <table_name> DROP PARTITIONS;
「REPAIR TABLE」を参照してください。
他の種類のパーティションのパスを手動で指定する
Hive スタイルのパーティション分割を使用しないテーブルの場合は、パーティションを追加するときにパーティションの場所を手動で指定する必要があります。 手動でパーティションを指定すると、MSCK REPAIR
構文と比較して待機時間を短縮することもでき、特に多数のパーティションを持つテーブルの場合に効果的です。 次の構文例は、パーティションの追加を示しています。
ALTER TABLE <table-name>
ADD PARTITION (<partition-column-name> = <partition-column-value>)
LOCATION 'abfss://<bucket-path>/<table-directory>/<partition-directory>';
また、ALTER TABLE
構文を使用してパーティションの削除、名前の変更、回復、場所の設定を行うこともできます。 「ALTER TABLE … PARTITION」を参照してください。
新しいパーティション メタデータを無効にする
新しいテーブルでパーティション メタデータを使用するかどうかを制御する Spark conf は、既定では無効になっています。 この動作を明示的に無効にすることもできます。 次の構文では、SQL を使用して Spark conf を無効にします。
SET spark.databricks.nonDelta.partitionLog.enabled = false;
これによって制御されるのは、SparkSession 内で作成されるテーブルでパーティション メタデータを使用するかどうかだけです。 この動作を使用するテーブルのパーティション メタデータを無効にするには、Spark conf が有効になっていない SparkSession の中でテーブルを削除して再作成する必要があります。
Note
パーティション メタデータが有効になっているテーブルの読み取りまたは書き込みを Databricks Runtime 12.2 LTS 以下で行うことはできませんが、Unity Catalog での十分な特権を持つユーザーは、これらのテーブルに対して DROP
または CREATE OR REPLACE TABLE
ステートメントを実行できます。
制限事項
次の制限があります。
- パーティション メタデータが有効になっているテーブルの読み取りまたは書き込みを、Databricks Runtime 12.2 LTS 以下を使用して行うことはできません。
- テーブルの読み取りにディレクトリ パスを使用すると、手動で追加または削除されたものも含めてすべてのパーティションが返されます。
- テーブル内のレコードを挿入または上書きするときにテーブル名ではなくパスを使用する場合は、パーティション メタデータは記録されません。
- Avro ファイル形式はサポートされていません。