重要
Databricks では、テーブル管理を簡略化し、クエリパフォーマンスを最適化するために、パーティション分割ではなく、液体クラスタリングを使用することをお勧めします。 表に液体クラスタリングを使用するを参照してください。
Unity カタログでは、ディレクトリを再帰的に一覧表示することで、外部テーブルのパーティションが自動的に検出されます。 パーティション 分割テーブルが大きい場合、パーティション メタデータ ログを有効にすると、検出の待機時間が短縮され、Hive メタストアとの一貫性が向上します。
Databricks は、パーティションを持つ Unity Catalog 外部テーブルの読み取り速度とクエリ パフォーマンス向上のためにパーティション メタデータ ログを有効にすることを推奨しています。
Unity カタログの既定のパーティション検出戦略
既定では、Unity Catalog はテーブルの場所にあるすべてのディレクトリを再帰的にリストすることによって自動的にパーティションを検出します。 多数のパーティション ディレクトリを持つ大規模なテーブルの場合は、これを行うことによって多くのテーブル操作の待機時間が長くなる可能性があります。
パーティション メタデータ ログを使用する
Databricks Runtime 13.3 LTS 以降では、必要に応じて、Unity カタログに登録されている外部テーブルのパーティション検出戦略であるパーティション メタデータ ログを有効にすることができます。 この動作は、Hive メタストアで使用されるパーティション検出戦略と整合しています。 この動作は、パーティションがあり、Parquet、ORC、CSV、Avro、または JSON を使用する Unity カタログの外部テーブルにのみ影響します。 Databricks は、このようなテーブルの読み取り速度とクエリのパフォーマンスを向上させるために新しい動作を有効にすることを推奨しています。
重要
パーティション メタデータ ログが有効になっているテーブルでは、パーティション検出の動作が異なります。 テーブルの場所を自動的にスキャンしてパーティションを見つけるのではなく、パーティション メタデータに登録されているパーティションのみが Unity Catalog によってパーティションとして認識されます。 「パーティション メタデータを手動で追加、削除、または修復する」を参照してください。
この機能が有効になっているテーブルの読み取りと書き込みができるのは、Databricks Runtime 13.3 LTS 以上を使用する場合のみです。
パーティション メタデータ ログを有効にする
テーブルのパーティション メタデータ ログを有効にするには、次の例に示すように、外部テーブルの作成時にテーブル プロパティを設定します。
CREATE OR REPLACE TABLE <catalog>.<schema>.<table-name>
USING <format>
PARTITIONED BY (<partition-column-list>)
TBLPROPERTIES ('partitionMetadataEnabled' = 'true')
LOCATION 'abfss://<bucket-path>/<table-directory>';
パーティション メタデータ ログが有効になっているテーブルを作成すると、Azure Databricks はパーティション メタデータを使用して後続のすべてのワークロードのテーブルを読み取ります。
Spark 構成を使用して、現在の SparkSessionのパーティション メタデータを有効にすることもできます。 有効にすると、SparkSession で作成された外部テーブルが、パーティション メタデータ テーブル プロパティを有効にして作成されます。 Spark 構成は既定でオフになっています。
次の構文は、SQL を使用してノートブックで Spark 構成を設定する方法を示しています。 Spark 構成の設定は、コンピューティングを構成するときに行うこともできます。
SET spark.databricks.nonDelta.partitionLog.enabled = true;
Spark 構成をオーバーライドするには、テーブルの作成時にテーブル プロパティを明示的に有効または無効にします。
重要
パーティション メタデータ ログが有効になっているテーブルの読み取りと書き込みができるのは 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>';
次の方法で、パーティション メタデータを使用してテーブルが作成されたかどうかを確認できます。
-
DESCRIBE EXTENDED table_nameによって返されるテーブルのプロパティ セクションを確認します。 - カタログ エクスプローラーでテーブルのメタデータを確認します。
テーブルのプロパティには、 partitionMetadataEnabled=trueが含まれています。
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 partition 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を参照してください。
制限事項
次の制限があります。
- ディレクトリ パスを使用してテーブルを読み取る場合、手動で追加または削除されたパーティションを含むすべてのパーティションが返されます。
- テーブル内のレコードを挿入または上書きするときにテーブル名ではなくパスを使用する場合は、パーティション メタデータは記録されません。