インデックスをスキップするデータ
DATASKIPPING INDEX
は Databricks Runtime 7.0 で削除されました。 代わりに、 データ スキップ機能が向上した Delta テーブルを使用することをお勧めします。
このドキュメントは廃止されており、更新されない可能性があります。 このコンテンツに記載されている製品、サービス、またはテクノロジはサポートされなくなりました。 「Delta Lake のデータのスキップ」を参照してください。
形容
Databricks Runtime には、パーティションのプルーニングに加えて、無関係なデータのスキャンを回避するための別の機能、つまり Data Skipping Index が含まれています。 ファイルレベルの統計情報を使用して、ファイルの粒度で追加のスキップを実行します。 これは、Hive スタイルのパーティション分割で機能しますが、これに依存しません。
データ・スキップの効果は、データの特性とその物理レイアウトによって異なります。 スキップはファイルの粒度で行われるため、データを複数のファイルに水平方向に分割することが重要です。 これは通常、複数の追加ジョブ、(シャッフル) パーティショニング、バケット化、および spark.sql.files.maxRecordsPerFile
の使用の結果として発生します。 これは、ソートされたバケット (df.write.bucketBy(...).sortBy(...).saveAsTable(...)
/ CREATE TABLE ... CLUSTERED BY ... SORTED BY ...
) を持つテーブル、またはパーティションキーと相関する列 ( brandName - modelName
、 companyID - stockPrice
など) だけでなく、データが何らかのソート性/クラスター化性を示す場合 ( orderID
、 bitcoinValue
など) でも最適に機能します。
このベータ機能には、いくつかの重要な 制限があります 。
- オプトインです:テーブルごとに手動で有効にする必要があります。
- これはSQLのみであり、データフレーム APIはありません。
- テーブルにインデックスが付けられると、インデックスが明示的に REFRESH されるまで、後続の
INSERT
またはADD PARTITION
操作の影響が表示される とは限りません 。
SQL 構文
インデックスの作成
CREATE DATASKIPPING INDEX ON [TABLE] [db_name.]table_name
指定されたテーブルで最初の (つまり、 左端) N 列をサポートし、 N は spark.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
指定されたテーブルで Data Skipping を無効にし、すべてのインデックス データを削除します。