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

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

この記事では、外部テーブルのデフォルト パーティション検出戦略と 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 では、これらのテーブルの読み取り速度とクエリ パフォーマンスを向上させるために、新しい動作を有効にすることをお勧めします。

important

パーティションメタデータのログ記録が有効になっているテーブルは、パーティション検出の動作の変更を示しています。 Unity Catalog は、テーブルの場所でパーティションを自動的にスキャンする代わりに、パーティション メタデータに登録されているパーティションのみを考慮します。 パーティションメタデータの手動追加、削除、または修復を参照してください。

この動作は、将来の Databricks Runtime バージョンでデフォルトになります。 この機能が有効になっているテーブルは、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 conf を使用して、現在の SparkSession のパーティション メタデータを有効にすることもできます。有効にすると、SparkSession で作成された外部テーブルは、パーティション メタデータ テーブル プロパティが有効になった状態で作成されます。Spark conf はデフォルトで無効になっています。

次の構文は、SQL を使用してノートブックに Spark conf を設定する方法を示しています。 コンピュートの設定時に Spark 設定することもできます。

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

テーブルの作成時にテーブル プロパティを明示的に有効または無効にすることで、Spark conf をオーバーライドできます。

important

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

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 ...パーティション

制限

次の制限があります。

  • Databricks Runtime 12.2 LTS 以下を使用してパーティション メタデータが有効になっているテーブルの読み取りまたは書き込みはできません。
  • ディレクトリパスを使用してテーブルを読むと、手動で追加または削除されたパーティションを含むすべてのパーティションが返されます。
  • テーブル名の代わりにパスを使用してテーブルにレコードを挿入または上書きすると、パーティションメタデータは記録されません。
  • Avro ファイル形式はサポートされていません。