メインコンテンツまでスキップ

外部テーブルのパーティション検出

重要

Databricks では、テーブル管理を簡素化し、クエリパフォーマンスを最適化するために、パーティション分割ではなく、リキッドクラスタリングを使用することをお勧めします。「テーブルにリキッドクラスタリングを使用する」を参照してください。

Unity Catalog は、ディレクトリを再帰的にリストすることで外部テーブルのパーティションを自動的に検出します。大規模なパーティションテーブルの場合、パーティションメタデータのログ記録を有効にすると、検出のレイテンシーが短縮され、Hive metastore との一貫性が向上します。

Databricks では、パーティションを含む Unity Catalog 外部テーブルの読み取り速度とクエリ パフォーマンスを向上させるために、パーティション メタデータ ログを有効にすることをお勧めします。

Unity Catalog におけるデフォルトのパーティション発見戦略

デフォルトでは、 Unity Catalog はテーブルの場所にあるすべてのディレクトリを再帰的に一覧表示して、パーティションを自動的に検出します。 多くのパーティションディレクトリを持つ大きなテーブルの場合、これにより多くのテーブルオペレーションのレイテンシーが増加する可能性があります。

パーティション メタデータ ログを使用する

Databricks Runtime 13.3 LTS 以降では、必要に応じて、Unity Catalog に登録されている外部テーブルのパーティション検出戦略であるパーティション メタデータ ログを有効にすることができます。この動作は、 Hive metastoreで使用されるパーティション検出戦略と一致しています。 この動作は、パーティションを持ち、Parquet、ORC、CSV、Avro、または JSON を使用する Unity Catalog 外部テーブルにのみ影響します。Databricks では、これらのテーブルの読み取り速度とクエリ パフォーマンスを向上させるために、新しい動作を有効にすることをお勧めします。

重要

パーティションメタデータのログ記録が有効になっているテーブルは、パーティション検出に関して異なる動作をします。Unity Catalogはテーブルの位置を自動的にスキャンする代わりに、パーティションメタデータに登録されたパーティションのみを尊重します。パーティションメタデータの手動追加、削除、または修復については、「パーティションメタデータの手動追加、削除、または修復」を参照してください。

この機能が有効であるテーブルは、Databricks Runtime 13.3 LTS以上でのみ読み書きが可能です。

パーティションメタデータのログ記録を有効にする

テーブルでパーティションメタデータログを有効にするには、次の例に示すように、外部テーブルを作成するときにテーブルプロパティを設定します。

SQL
CREATE OR REPLACE TABLE <catalog>.<schema>.<table-name>
USING <format>
PARTITIONED BY (<partition-column-list>)
TBLPROPERTIES ('partitionMetadataEnabled' = 'true')
LOCATION 's3://<bucket-path>/<table-directory>';

パーティション メタデータのログ記録を有効にしてテーブルを作成すると、Databricks はパーティション メタデータを使用して、後続のすべてのワークロードでテーブルを読み取ります。

また、Sparkの設定を使って現在の SparkSessionのパーティションメタデータを有効にすることもできます。有効化されると、SparkSessionで作成された外部テーブルはパーティションメタデータテーブルプロパティを有効にして作成されます。Sparkの設定はデフォルトでオフになっています。

以下の構文は、ノートブック内でSQLを使ってSparkの設定を設定する方法を示しています。コンピュート設定時にSparkの設定も可能です。

SQL
SET spark.databricks.nonDelta.partitionLog.enabled = true;

テーブル作成時にテーブルプロパティを明示的に有効化または無効化することで、Sparkの設定を上書きできます。

重要

Databricks Runtime 13.3 LTS 以降では、パーティション メタデータのログ記録が有効になっているテーブルのみの読み取りと書き込みが可能です。Databricks Runtime 12.2 LTS を使用してこれらのテーブルを読み取るには、パーティション メタデータ テーブル プロパティを無効にしてテーブルを削除し、再作成する必要があります。

外部テーブルは、基になるデータ ファイルをドロップしても削除されません。 Databricks では、次の例のように、 CREATE OR REPLACE 構文を使用してテーブルをアップグレードし、パーティション メタデータ ログを使用することをお勧めします。

SQL
CREATE OR REPLACE TABLE <catalog>.<schema>.<table-name>
USING <format>
PARTITIONED BY (<partition-column-list>)
LOCATION 's3://<bucket-path>/<table-directory>';

パーティションメタデータを使用してテーブルが作成されたかどうかは、次の方法で確認できます。

  • DESCRIBE EXTENDED table_nameによって返されるテーブルのプロパティセクションを確認します。
  • カタログ エクスプローラーでテーブル メタデータを確認します。

テーブルプロパティにpartitionMetadataEnabled=trueが含まれています。

Unity Catalog では、テーブルとボリュームのパスの重複に関するルールが適用されます。 データ ファイルのコレクションにテーブルが既に存在する場合、その場所に新しい Unity Catalog テーブルを登録することはできません。

パーティション メタデータを持つテーブルを操作する

Databricks では、Unity Catalog に登録されているすべてのテーブルに対するすべての読み取りと書き込みでテーブル名を使用することをお勧めします。 パーティションメタデータを持つテーブルの場合、これにより、テーブルに追加された新しいパーティションが Unity Catalog に登録され、そのテーブルに対するクエリが登録されているすべてのパーティションを読み取ることが保証されます。

読み取りまたは書き込みにパスベースのパターンを使用すると、パーティションが無視されたり、Unity Catalog メタストアに登録されなかったりする可能性があります。 制限事項を参照してください。

パーティションの一覧表示

次のコマンドを使用して、Unity Catalog にパーティション メタデータとして登録されているすべてのパーティションを表示します。

SQL
SHOW PARTITIONS <table-name>

1 つのパーティションが Unity Catalog に登録されているかどうかを確認するには、次のコマンドを使用します。

SQL
SHOW PARTITIONS <table-name>
PARTITION (<partition-column-name> = <partition-column-value>)

パーティションメタデータの手動追加、削除、または修復

Unity Catalog では、外部テーブルのすべてのパーティションが、テーブル登録時に LOCATION 句を使用して登録されたディレクトリ内に含まれている必要があります。

パーティション・メタデータを有効にすると、テーブル・ロケーション内のパーティションの自動検出は無効になります。 外部システムがテーブルの場所にデータを書き込む場合、またはパスベースの書き込みを使用してテーブル内のレコードを追加または上書きする場合は、パーティションメタデータを手動で修復する必要があります。

Databricks では、Parquet、ORC、CSV、JSON でサポートされるテーブルを格納するために、Hive スタイルのパーティション分割が使用されます。 Hive スタイルのパーティションには、パーティション ディレクトリ内で等号で接続されたキーと値のペアが含まれます (例: year=2021/month=01/)。

テーブルで Hive スタイルのパーティション分割を使用している場合は、 MSCK REPAIR を使用して、Unity Catalog のパーティション メタデータをテーブルの場所に存在するパーティションと同期できます。 次の構文例は、一般的な操作を示しています。

SQL
-- 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 構文と比較してレイテンシーを短縮することもできます。 次の構文例は、パーティションの追加を示しています。

SQL
ALTER TABLE <table-name>
ADD PARTITION (<partition-column-name> = <partition-column-value>)
LOCATION 's3://<bucket-path>/<table-directory>/<partition-directory>';

また、 ALTER TABLE 構文を使用して、パーティションの削除、名前変更、リカバリ、および場所の設定を行うこともできます。 ALTER TABLE ...パーティション

制限

次の制限があります。

  • ディレクトリパスを使用してテーブルを読み取ると、手動で追加または削除されたパーティションも含め、すべてのパーティションが返されます。
  • テーブル名の代わりにパスを使用してテーブルにレコードを挿入または上書きすると、パーティションメタデータは記録されません。