データ スキップ インデックス

重要

DATASKIPPING INDEX は Databricks Runtime 7.0 で削除されました。 代わりに Delta テーブルを使用することをお勧めします。これにより、向上したデータ スキップ機能が提供されます。

重要

このドキュメントは廃止され、更新されない可能性があります。 このコンテンツで言及されている製品、サービス、テクノロジは、サポートされなくなりました。 「Delta Lake に対するデータのスキップ」を参照してください。

説明

パーティションの排除に加えて、Databricks Runtime には、無関係なデータのスキャンを回避することを意図した別の機能 (つまり、データ スキップ インデックス) が含まれています。 ここでは、ファイルの細分性で追加のスキップを実行する目的で、ファイルレベルの統計が使用されます。 これは Hive スタイルのパーティション分割で機能しますが、これに依存しません。

データ スキップの有効性は、データの特性とその物理レイアウトに依存します。 スキップはファイルの細分性で行われるため、データが複数のファイル間で水平方向にパーティション分割されていることが重要です。 これは通常、複数の追加ジョブ、(シャッフル) パーティション分割、バケット化、または spark.sql.files.maxRecordsPerFile の使用の結果として発生します。 これが最適なのは、並べ替えされたバケットを持つテーブル (df.write.bucketBy(...).sortBy(...).saveAsTable(...) / CREATE TABLE ... CLUSTERED BY ... SORTED BY ...) や、パーティション キーに関連付けられている列を持つテーブル (brandName - modelNamecompanyID - stockPrice など) のほかに、データが何らかの並べ替え済みの性質やクラスター化された性質 (orderIDbitcoinValue など) を示すだけの場合も該当します。

注意

このベータ機能には、いくつかの重要な "制限事項" があります。

  • オプトインである: テーブルごとに手動で有効にする必要があります。
  • SQL 限定である: このための DataFrame API はありません。
  • テーブルのインデックスの作成後は、インデックスが明示的に REFRESH されるまで、後続の INSERT 操作または ADD PARTITION 操作の影響が表示される "保証はありません"。

SQL 構文

インデックスの作成

CREATE DATASKIPPING INDEX ON [TABLE] [db_name.]table_name

指定されたテーブルで、最初の (つまり一番左の) N 個のサポートされる列でデータ スキップを有効にします。Nspark.databricks.io.skipping.defaultNumIndexedCols で制御されます (既定値: 32)

partitionBy 列には常にインデックスが作成され、この N にはカウントされません。

列のインデックスの作成

CREATE DATASKIPPING INDEX ON [TABLE] [db_name.]table_name
    FOR COLUMNS (col1, ...)

指定されたテーブルで、指定された列のリストのデータ スキップを有効にします。 上記と同じように、指定された列に加えてすべての partitionBy 列で常にインデックスが作成されます。

インデックスの記述

DESCRIBE DATASKIPPING INDEX [EXTENDED] ON [TABLE] [db_name.]table_name

収集されるファイル レベルの統計の対応する種類に加えて、指定されたテーブルのインデックスが作成される列が表示されます。

EXTENDED が指定された場合、"effectiveness_score" という 3 番目の列が表示され、対応する列のフィルターに対して DataSkipping がどれだけ有益であると予想されるかの概算的測定値が示されます。

インデックスの完全更新

REFRESH DATASKIPPING INDEX ON [TABLE] [db_name.]table_name

インデックス全体を再構築します。 つまり、テーブルのすべてのパーティションのインデックスが再設定されます。

パーティションの更新

REFRESH DATASKIPPING INDEX ON [TABLE] [db_name.]table_name
    PARTITION (part_col_name1[=val1], part_col_name2[=val2], ...)

指定したパーティションのみインデックスを再設定します。 この操作は通常、インデックスの完全更新よりも高速であるはずです。

インデックスの削除

DROP DATASKIPPING INDEX ON [TABLE] [db_name.]table_name

指定したテーブルのデータ スキップを無効にし、すべてのインデックス データを削除します。