外部テーブルのパーティション検出
この記事では、外部テーブルのデフォルト パーティション検出戦略と 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>
1 つのパーティションが 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 ...パーティション。
新しいパーティションメタデータを無効にする
新しいテーブルがパーティションメタデータを使用するかどうかを制御する Spark conf は、デフォルトでは無効になっています。 この動作を明示的に無効にすることもできます。 次の構文では、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 ファイル形式はサポートされていません。