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

この記事では、 Unity Catalog外部テーブルのデフォルトのパーティション検出戦略と、パーティション検出をHive metastoreと一致させるパーティション メタデータ ログを有効にするオプションの設定について説明します。

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

Unity Catalog のデフォルトのパーティション検出戦略は何ですか?

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

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

プレビュー

この機能はパブリックプレビュー段階です。

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

重要

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

この動作は、将来の Databricks Runtime バージョンではデフォルトになります。 この機能が有効になっているテーブルは、Databricks Runtime 13.3 LTS 以降を使用してのみ読み取りまたは書き込みが可能です。

注:

新しいパーティション ログ動作が使用されていないことを確認するには、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 's3://<bucket-path>/<table-directory>';

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

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

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

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

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

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

SHOW PARTITIONS <table-name>

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

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 内のパーティション メタデータをテーブルの場所に存在するパーティションと同期できます。 次の構文例は、一般的な操作を示しています。

-- 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 's3://<bucket-path>/<table-directory>/<partition-directory>';

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

新しいパーティションメタデータを無効にする

新しいテーブルがパーティション メタデータを使用するかどうかを制御する Spark 設定は、デフォルトでは無効になっています。 この動作を明示的に無効にすることもできます。 次の構文では、SQL を使用して Spark conf を無効にします。

SET spark.databricks.nonDelta.partitionLog.enabled = false;

これは、SparkSession で作成されたテーブルがパーティション メタデータを使用するかどうかのみを制御します。 この動作を使用するテーブルでパーティション メタデータを無効にするには、Spark conf が有効になっていない SparkSession でテーブルを削除して再作成する必要があります。

注:

Databricks Runtime 12.2 LTS 以下ではパーティション メタデータが有効になっているテーブルに対して読み取りまたは書き込みを行うことはできませんが、Unity Catalog で十分な権限がある場合は、これらのテーブルに対してDROPまたはCREATE OR REPLACE TABLEステートメントを実行できます。

制限事項

次の制限があります。

  • Databricks Runtime 12.2 LTS 以下を使用して、パーティション メタデータが有効になっているテーブルを読み取ったり書き込んだりすることはできません。

  • ディレクトリパスを使用してテーブルを読み取ると、手動で追加または削除されたパーティションを含むすべてのパーティションが返されます。

  • テーブル名の代わりにパスを使用してテーブルにレコードを挿入または上書きすると、パーティションメタデータは記録されません。

  • Avro ファイル形式はサポートされていません。