0 / 0
資料の 英語版 に戻る
Spark SQLのデータ・スキップ
最終更新: 2024年11月21日
Spark SQLのデータ・スキップ

データ・スキップにより、各オブジェクトに関連付けられた要約メタデータに基づいて無関係なデータ・オブジェクトまたはファイルをスキップすることで、SQL照会のパフォーマンスを大幅に向上させることができます。

データ・スキップは、Apache Sparkを使用してデータ・スキップ索引を作成、管理、およびデプロイするために、オープン・ソースのXskipperライブラリーを使用します。 Xskipper-拡張可能データ・スキップ・フレームワーク (Xskipper-An Extensible Data Skipping Framework)を参照してください。

Xskipperの操作方法についての詳しくは、以下を参照してください:

Xskipperのオープン・ソース機能に加えて、以下の機能も使用できます:

地理空間データのスキップ

spatio-temporal ライブラリーから 地理空間関数 を使用して地理空間データ・セットを照会するときに、データ・スキップを使用することもできます。

  • 緯度と経度の列を持つデータ・セットのデータ・スキップの利点を活用するために、緯度と経度の列の最小/最大索引を収集できます。
  • データ・スキップは、組み込み Xskipper プラグインを使用して、形状列 (UDT 列) を持つデータ・セットで使用できます。

次のセクションでは、地理空間プラグインを操作する方法について説明します。

地理空間プラグインのセットアップ

プラグインを使用するには、登録モジュールを使用して、関連する実装をロードします。 なお、Scalaを使用できるのはIBM Analytics Enginepowered byApache Sparkのアプリケーションのみで、watsonx.aiStudioでは使用できない。

  • Scala の場合:

    import com.ibm.xskipper.stmetaindex.filter.STMetaDataFilterFactory
    import com.ibm.xskipper.stmetaindex.index.STIndexFactory
    import com.ibm.xskipper.stmetaindex.translation.parquet.{STParquetMetaDataTranslator, STParquetMetadatastoreClauseTranslator}
    import io.xskipper._
    
    Registration.addIndexFactory(STIndexFactory)
    Registration.addMetadataFilterFactory(STMetaDataFilterFactory)
    Registration.addClauseTranslator(STParquetMetadatastoreClauseTranslator)
    Registration.addMetaDataTranslator(STParquetMetaDataTranslator)
    
  • Python の場合:

    from xskipper import Xskipper
    from xskipper import Registration
    
    Registration.addMetadataFilterFactory(spark, 'com.ibm.xskipper.stmetaindex.filter.STMetaDataFilterFactory')
    Registration.addIndexFactory(spark, 'com.ibm.xskipper.stmetaindex.index.STIndexFactory')
    Registration.addMetaDataTranslator(spark, 'com.ibm.xskipper.stmetaindex.translation.parquet.STParquetMetaDataTranslator')
    Registration.addClauseTranslator(spark, 'com.ibm.xskipper.stmetaindex.translation.parquet.STParquetMetadatastoreClauseTranslator')
    

インデックスの構築

索引を作成するには、 addCustomIndex API を使用できます。 なお、Scalaを使用できるのはIBM Analytics Enginepowered byApache Sparkのアプリケーションのみで、watsonx.aiStudioでは使用できない。

  • Scala の場合:

    import com.ibm.xskipper.stmetaindex.implicits._
    
    // index the dataset
    val xskipper = new Xskipper(spark, dataset_path)
    
    xskipper
      .indexBuilder()
      // using the implicit method defined in the plugin implicits
      .addSTBoundingBoxLocationIndex("location")
      // equivalent
      //.addCustomIndex(STBoundingBoxLocationIndex("location"))
      .build(reader).show(false)
    
  • Python の場合:

    xskipper = Xskipper(spark, dataset_path)
    
    # adding the index using the custom index API
    xskipper.indexBuilder() \
            .addCustomIndex("com.ibm.xskipper.stmetaindex.index.STBoundingBoxLocationIndex", ['location'], dict()) \
            .build(reader) \
            .show(10, False)
    

サポート対象関数

サポートされている地理空間関数を以下に示します。

  • ST_Distance
  • ST_Intersects
  • ST_Contains
  • ST_Equals
  • ST_Crosses
  • ST_Touches
  • ST_Within
  • ST_Overlaps
  • ST_EnvelopesIntersect
  • ST_IntersectsInterior

索引の暗号化

Parquetメタデータ・ストアを使用する場合は、オプションでParquet Modular Encryption(PME)を使用してメタデータを暗号化できます。 これは、メタデータ自体をParquetデータ・セットとして保管することによって実現されるため、PMEを使用して暗号化することができます。 この機能は、すべての入力フォーマットに適用されます。例えば、CSV形式で保管されたデータ・セットは、PMEを使用してメタデータを暗号化できます。

以下のセクションでは、特に指定されていない限り、フッター、列などを参照する場合、これらは索引付きデータ・セット内のオブジェクトではなく、メタデータ・オブジェクトに関します。

索引の暗号化は、以下のようにモジュール式で細分化されます:

  • 各索引は、(索引ごとのキー細分度を使用して) 暗号化することも、プレーン・テキストのままにすることもできます。
  • フッター+オブジェクト名の列:
    • それ自体がParquetファイルであるメタデータ・オブジェクトのフッター列には、以下のものが含まれます:
      • メタデータ・オブジェクトのスキーマ。収集されたすべての索引のタイプ、パラメーター、および列名が表示されます。 例えば、BloomFilterが、0.1という誤検出確率で列city に定義されていることがわかります。
      • 元のデータ・セットへの絶対パス、またはHiveメタストア・テーブルの場合はテーブル名。
    • オブジェクト名の列には、すべての索引付きオブジェクトの名前が格納されます。
  • フッター+メタデータ列は、以下のいずれかにできます:
    • 両方は同じ鍵を使用して暗号化されています。 これはデフォルトです。 この場合、暗号化されたフッター・モードでメタデータを構成するParquetオブジェクトのプレーン・テキスト・フッター構成、および選択されたキーを使用してオブジェクト名の列が暗号化されます。

    • 両方ともプレーン・テキストです。 この場合、メタデータを構成するParquetオブジェクトはプレーン・テキスト・フッター・モードであり、オブジェクト名の列は暗号化されていません。

      少なくとも1つの索引に暗号化のマークが付けられている場合は、プレーン・テキスト・フッター・モードが有効かどうかに関係なく、フッター・キーを構成する必要があります。 プレーン・テキスト・フッターが設定されている場合、フッター・キーは改ざんのプルーフィングにのみ使用されます。 その場合、オブジェクト名の列は改ざんされないことに注意してください。

      フッター・キーが構成されている場合は、少なくとも1つの索引を暗号化する必要があります。

索引暗号化を使用する前に、PMEの資料を調べて、概念に精通していることを確認してください。

重要: 索引暗号化を使用する場合、 key がいずれかの Xskipper API で構成されていると、常にラベル「NEVER 鍵自体」になります。

インデックス暗号化を使用する場合:

  1. すべてのステップに従って、PMEが有効になっていることを確認します。 PMEを参照してください。

  2. すべての正規PME構成(鍵管理構成を含む)を実行します。

  3. データ・セットの暗号化メタデータを作成します:

    1. 通常のフローに従ってメタデータを作成します。
    2. フッター鍵を構成します。 プレーン・テキストのフッター+オブジェクト名の列を設定する場合は、io.xskipper.parquet.encryption.plaintext.footertrueに設定します(以下のサンプルを参照)。
    3. IndexBuilderで、暗号化する索引ごとに、その索引に使用する鍵のラベルを追加します。

    照会時にメタデータを使用する場合、または既存のメタデータをリフレッシュする場合は、鍵がアクセス可能であることを確認するのに必要な正規PMEセットアップ以外には、セットアップは必要ありません(暗号化されたデータ・セットを読み取るために必要な構成と同じです)。

サンプル

以下のサンプルは、k1と指定された鍵をフッター+オブジェクト名の鍵として使用し、k2と指定された鍵を tempMinMaxを暗号化するための鍵として使用して、その一方でプレーン・テキストのままのcityValueListを作成して、メタデータを作成する方法を示しています。 なお、Scalaを使用できるのはIBM Analytics Enginepowered byApache Sparkのアプリケーションのみで、watsonx.aiStudioでは使用できない。

  • Scala の場合:

    // index the dataset
    val xskipper = new Xskipper(spark, dataset_path)
    // Configuring the JVM wide parameters
    val jvmComf = Map(
      "io.xskipper.parquet.mdlocation" -> md_base_location,
      "io.xskipper.parquet.mdlocation.type" -> "EXPLICIT_BASE_PATH_LOCATION")
    Xskipper.setConf(jvmConf)
    // set the footer key
    val conf = Map(
      "io.xskipper.parquet.encryption.footer.key" -> "k1")
    xskipper.setConf(conf)
    xskipper
      .indexBuilder()
      // Add an encrypted MinMax index for temp
      .addMinMaxIndex("temp", "k2")
      // Add a plaintext ValueList index for city
      .addValueListIndex("city")
      .build(reader).show(false)
    
  • Pythonの場合

    xskipper = Xskipper(spark, dataset_path)
    # Add JVM Wide configuration
    jvmConf = dict([
      ("io.xskipper.parquet.mdlocation", md_base_location),
      ("io.xskipper.parquet.mdlocation.type", "EXPLICIT_BASE_PATH_LOCATION")])
    Xskipper.setConf(spark, jvmConf)
    # configure footer key
    conf = dict([("io.xskipper.parquet.encryption.footer.key", "k1")])
    xskipper.setConf(conf)
    # adding the indexes
    xskipper.indexBuilder() \
            .addMinMaxIndex("temp", "k1") \
            .addValueListIndex("city") \
            .build(reader) \
            .show(10, False)
    

フッター+オブジェクト名を(前述のように)プレーン・テキスト・モードのままにする場合は、構成パラメーターを追加する必要があります:

  • Scala の場合:

    // index the dataset
    val xskipper = new Xskipper(spark, dataset_path)
    // Configuring the JVM wide parameters
    val jvmComf = Map(
      "io.xskipper.parquet.mdlocation" -> md_base_location,
      "io.xskipper.parquet.mdlocation.type" -> "EXPLICIT_BASE_PATH_LOCATION")
    Xskipper.setConf(jvmConf)
    // set the footer key
    val conf = Map(
      "io.xskipper.parquet.encryption.footer.key" -> "k1",
      "io.xskipper.parquet.encryption.plaintext.footer" -> "true")
    xskipper.setConf(conf)
    xskipper
      .indexBuilder()
      // Add an encrypted MinMax index for temp
      .addMinMaxIndex("temp", "k2")
      // Add a plaintext ValueList index for city
      .addValueListIndex("city")
      .build(reader).show(false)
    
  • Pythonの場合

    xskipper = Xskipper(spark, dataset_path)
    # Add JVM Wide configuration
    jvmConf = dict([
    ("io.xskipper.parquet.mdlocation", md_base_location),
    ("io.xskipper.parquet.mdlocation.type", "EXPLICIT_BASE_PATH_LOCATION")])
    Xskipper.setConf(spark, jvmConf)
    # configure footer key
    conf = dict([("io.xskipper.parquet.encryption.footer.key", "k1"),
    ("io.xskipper.parquet.encryption.plaintext.footer", "true")])
    xskipper.setConf(conf)
    # adding the indexes
    xskipper.indexBuilder() \
            .addMinMaxIndex("temp", "k1") \
            .addValueListIndex("city") \
            .build(reader) \
            .show(10, False)
    

結合を使用したデータ・スキップ (Spark 3 の場合のみ)

Spark 3 では、以下のような結合照会でデータ・スキップを使用できます:

SELECT *
FROM orders, lineitem 
WHERE l_orderkey = o_orderkey and o_custkey = 800

この例は、TPC-H ベンチマーク・スキーマ ( TPC-Hを参照) に基づくスター・スキーマを示しています。ここで、lineitem はファクト表であり、多数のレコードを含んでいます。一方、orders 表は、ファクト表と比較して比較的少数のレコードを持つディメンション表です。

上記の照会には、少数のレコードを含む orders 表の述部があります。これは、min/max を使用しても、データ・スキップの利点はあまり得られないことを意味します。

動的データ・スキップ は、上記のような照会で、最初に orders 表の条件に基づいて関連する l_orderkey 値を抽出し、次にそれを使用して、データ・スキップ索引を使用して無関係なオブジェクトをフィルタリングする l_orderkey の述部をプッシュダウンすることにより、データ・スキップの利点を活用できるようにする機能です。

この機能を使用するには、以下の最適化ルールを有効にします。 なお、Scalaを使用できるのはIBM Analytics Enginepowered byApache Sparkのアプリケーションのみで、watsonx.aiStudioでは使用できない。

  • Scala の場合:

      import com.ibm.spark.implicits.
    
      spark.enableDynamicDataSkipping()
    
  • Python の場合:

        from sparkextensions import SparkExtensions
    
        SparkExtensions.enableDynamicDataSkipping(spark)
    

その後、通常どおり Xskipper API を使用すると、照会でデータ・スキップを使用する利点が得られます。

例えば、上記の照会では、min/max を使用して l_orderkey を索引付けすると、 lineitem 表をスキップオーバーすることができ、照会のパフォーマンスが向上します。

古いメタデータのサポート

Xskipperは、MetaIndexManagerによって作成された古いメタデータをシームレスにサポートします。 Xskipperメタデータの更新は次回のリフレッシュ操作で自動的に実行されるため、古いメタデータを使用してスキップすることができます。

索引をリストしたり、describeIndex操作を実行したりするときに索引の前にDEPRECATED_SUPPORTEDが表示される場合、メタデータ・バージョンは非推奨ですが、引き続きサポートされているため、スキップしても機能します。 次のリフレッシュ操作では、メタデータが自動的に更新されます。

親トピック: ノートブックおよびスクリプト

生成 AI の検索と回答
これらの回答は、製品資料の内容に基づいて、 watsonx.ai のラージ言語モデルによって生成されます。 詳細