データ スキップ インデックス
重要
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 - modelName
、companyID - stockPrice
など) のほかに、データが何らかの並べ替え済みの性質やクラスター化された性質 (orderID
、bitcoinValue
など) を示すだけの場合も該当します。
注意
このベータ機能には、いくつかの重要な "制限事項" があります。
- オプトインである: テーブルごとに手動で有効にする必要があります。
- SQL 限定である: このための DataFrame 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
指定したテーブルのデータ スキップを無効にし、すべてのインデックス データを削除します。