0 / 0
Zurück zur englischen Version der Dokumentation
Daten werden für Spark-SQL übersprungen
Letzte Aktualisierung: 21. Nov. 2024
Daten werden für Spark-SQL übersprungen

Das Überspringen von Daten kann die Leistung von SQL-Abfragen erheblich steigern, indem es überspringt irrelevante Datenobjekte oder Dateien auf der Basis einer zusammenfassenden Metadaten, die jedem Objekt zugeordnet sind, überspringt.

Beim Überspringen von Daten wird die Open-Source-Xskipper-Bibliothek zum Erstellen, Verwalten und Implementieren von Daten-Überspringen von Indizes mit Apache Spark verwendet. Siehe Xskipper-An Extensible Data Skipping Framework.

Weitere Informationen zum Arbeiten mit Xskipper finden Sie unter:

Zusätzlich zu den Open-Source-Funktionen in Xskipper sind auch die folgenden Funktionen verfügbar:

Data-Skipping für Geodaten

Sie können das Überspringen von Daten auch verwenden, wenn Sie geografisch-räumliche Datasets mit geografisch-räumlichen Funktionen aus der räumlich-zeitlichen Bibliothek abfragen.

  • Zum Nutzen von Daten, die in Dateien mit Längen-und Breitengradspalten übersprungen werden, können Sie die min/max-Indizes für die Spalten 'Breitengrad' und 'Längengrad' erfassen.
  • Das Überspringen von Daten kann in Datasets mit einer Geometriespalte (einer UDT-Spalte) mithilfe eines integrierten Xskipper-Plug-ins verwendet werden.

In den nächsten Abschnitten wird gezeigt, dass Sie mit dem Geospatial-Plug-in arbeiten.

Geospatial-Plug-in einrichten

Um das Plug-in zu verwenden, laden Sie die relevanten Implementierungen mithilfe des Registrierungsmoduls. Beachten Sie, dass Sie Scala nur in Anwendungen in IBM Analytics Engine powered by Apache Spark verwenden können, nicht in watsonx.ai Studio.

  • Für 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)
    
  • Für 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')
    

Indexerstellung

Zur Indexerstellung können Sie die addCustomIndex -API verwenden. Beachten Sie, dass Sie Scala nur in Anwendungen in IBM Analytics Engine powered by Apache Spark verwenden können, nicht in watsonx.ai Studio.

  • Für 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)
    
  • Für 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)
    

Unterstützte Funktionen

Die Liste der unterstützten geografisch-räumlichen Funktionen umfasst folgende:

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

Verschlüsseln von Indizes

Wenn Sie einen Parquet-Metadaten-Speicher verwenden, können die Metadaten optional mit Parquet Modular Encryption (PME) verschlüsselt werden. Dies wird dadurch erreicht, dass die Metadaten selbst als Parkett-Datei gespeichert werden und somit PME zum Verschlüsseln verwendet werden kann. Diese Funktion gilt für alle Eingabeformate, z. B. kann ein im CSV-Format gespeichertes Dataset über PME-Daten verschlüsselt werden.

Wenn im folgenden Abschnitt auf Fußzeilen, Spalten usw. verwiesen wird, beziehen sich diese, sofern nicht anders angegeben, auf Metadatenobjekte und nicht auf Objekte in der indexierten Datei.

Die Indexverschlüsselung ist modular und in der folgenden Weise differenziert:

  • Jeder Index kann entweder verschlüsselt sein (mit einer Granularität pro Indexschlüssel) oder im Klartext belassen werden
  • Spalte für Fußzeile + Objektname:
    • Die Footer-Spalte des Metadatenobjekts, das an sich eine Parquet-Datei ist, enthält unter anderem:
      • Schema des Metadatenobjekts, das die Typen, Parameter und Spaltennamen für alle erfassten Indizes enthüllt. Sie können beispielsweise erkennen, dass eine BloomFilterin Spalte citymit einer falsch-positiven Wahrscheinlichkeit von 0.1definiert ist.
      • Der vollständige Pfad zur ursprünglichen Datei oder zum Tabellennamen im Fall einer Hive-Metaspeichertabelle.
    • In der Objektnamensspalte werden die Namen aller indexierten Objekte gespeichert.
  • Die Spalte 'footer + metadata' kann Folgendes sein:
    • Beide verschlüsselt mit demselben Schlüssel. Dies ist der Standardwert. In diesem Fall wird die Klartextfußzeilenkonfiguration für die Parquet-Objekte mit den Metadaten im verschlüsselten Fußzeilenmodus und die Objektnamensspalte unter Verwendung des ausgewählten Schlüssels verschlüsselt.

    • Beides in unverschlüsseltem Text. In diesem Fall befinden sich die Parquet-Objekte, die die Metadaten enthalten, im Klartext-Fußzeilenmodus, und die Objektnamensspalte ist nicht verschlüsselt.

      Wenn mindestens ein Index als verschlüsselt markiert ist, muss ein Fußzeilenschlüssel konfiguriert werden, unabhängig davon, ob der Fußzeilenmodus "Klartext" aktiviert ist oder nicht. Wenn der Klartext-Fußzeile eingestellt ist, wird der Fußzeilenschlüssel nur für die Tamper-Proofing verwendet. Beachten Sie, dass in diesem Fall die Objektnamensspalte nicht manipulationssicher ist.

      Wenn ein Fußzeilenschlüssel konfiguriert ist, muss mindestens ein Index verschlüsselt werden.

Bevor Sie die Indexverschlüsselung verwenden, sollten Sie die Dokumentation unter PME lesen und sicherstellen, dass Sie mit den Konzepten vertraut sind.

Wichtig: Bei der Verwendung der Indexverschlüsselung ist immer dann, wenn ein key in einer Xskipper-API konfiguriert ist, immer die Bezeichnung 'NEVER der Schlüssel selbst'.

So verwenden Sie die Indexverschlüsselung:

  1. Führen Sie alle Schritte aus, um sicherzustellen, dass PME aktiviert ist. Siehe PME.

  2. Führen Sie alle Regulär -PME-Konfigurationen aus, einschließlich Schlüsselmanagementkonfigurationen.

  3. Erstellen Sie verschlüsselte Metadaten für eine Datei:

    1. Folgen Sie dem regulären Ablauf zum Erstellen von Metadaten.
    2. Konfigurieren Sie einen Fußzeilenschlüssel. Wenn Sie eine einfache Textfußzeile + Objektnamensspalte festlegen möchten, setzen Sie io.xskipper.parquet.encryption.plaintext.footerauf true(siehe Beispiele unten).
    3. Fügen Sie in IndexBuilderfür jeden Index, den Sie verschlüsseln möchten, den Kennsatz des Schlüssels hinzu, der für diesen Index verwendet wird.

    Um Metadaten während der Abfragezeit zu verwenden oder vorhandene Metadaten zu aktualisieren, ist keine andere Konfiguration als die Regulär -PME-Konfiguration erforderlich, um sicherzustellen, dass auf die Schlüssel zugegriffen werden kann (buchstäblich dieselbe Konfiguration, die zum Lesen eines verschlüsselten Datasets erforderlich ist).

Beispiele

Die folgenden Beispiele zeigen die Metadatenerstellung unter Verwendung eines Schlüssels mit dem Namen k1als Fußzeile + Objektnamensschlüssel und eines Schlüssels mit dem Namen k2als Schlüssel zur Verschlüsselung eines MinMaxfür temp, während gleichzeitig ein ValueListfür cityerstellt wird, das in unverschlüsseltem Text verbleibt. Beachten Sie, dass Sie Scala nur in Anwendungen in IBM Analytics Engine powered by Apache Spark verwenden können, nicht in watsonx.ai Studio.

  • Für 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)
    
  • Für 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)
    

Wenn der Fußzeile + Objektname (wie oben erwähnt) im Klartext-Modus belassen werden soll, müssen Sie den Konfigurationsparameter hinzufügen:

  • Für 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)
    
  • Für 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)
    

Daten werden mit Joins übersprungen (nur für Spark 3)

Mit Spark 3 können Sie Daten, die in Joinabfragen übersprungen werden, wie z. B.:

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

Dieses Beispiel zeigt ein Sternschema auf der Basis des TPC-H-Benchmark-Schemas (siehe TPC-H), wobei "lineitem" eine Fakttabelle ist und viele Datensätze enthält, während die Tabelle "orders" eine Dimensionstabelle ist, die im Vergleich zu den Fakttabellen eine relativ geringe Anzahl von Datensätzen enthält.

Die obige Abfrage verfügt über ein Vergleichselement für die Ordnungstabellen, das eine kleine Anzahl von Datensätzen enthält, was bedeutet, dass die Verwendung von min/max nicht viel von Daten-Überspringen profitiert.

Dynamische Daten werden übersprungen ist eine Funktion, die es Abfragen wie den obigen ermöglicht, vom Überspringen von Daten zu profitieren, indem zuerst die relevanten l_orderkey-Werte auf der Basis der Bedingung in der Tabelle orders extrahiert und dann verwendet werden, um ein Vergleichselement auf l_orderkey zu übertragen, das Indizes zum Überspringen von Daten verwendet, um irrelevante Objekte zu filtern.

Aktivieren Sie die folgende Optimierungsregel, um diese Funktion zu verwenden: Beachten Sie, dass Sie Scala nur in Anwendungen in IBM Analytics Engine powered by Apache Spark verwenden können, nicht in watsonx.ai Studio.

  • Für Scala:

      import com.ibm.spark.implicits.
    
      spark.enableDynamicDataSkipping()
    
  • Für Python:

        from sparkextensions import SparkExtensions
    
        SparkExtensions.enableDynamicDataSkipping(spark)
    

Dann verwenden Sie die Xskipper-API wie gewohnt und Ihre Abfragen profitieren von der Verwendung von Daten-Überspringen.

Beispiel: In der obigen Abfrage ermöglicht die Indexierung l_orderkey mit "min/max" das Überspringen der Tabelle lineitem und verbessert die Abfrageleistung.

Unterstützung für ältere Metadaten

Xskipper unterstützt nahtlos ältere Metadaten, die der MetaIndexManager erstellt. Ältere Metadaten können zum Überspringen verwendet werden, da Aktualisierungen für die Xskipper-Metadaten automatisch durch die nächste Aktualisierungsoperation ausgeführt werden.

Wenn DEPRECATED_SUPPORTEDvor einem Index angezeigt wird, wenn Indizes aufgelistet werden oder eine describeIndex-Operation ausgeführt wird, ist die Metadatenversion veraltet, wird jedoch weiterhin unterstützt, und das Überspringen funktioniert. Bei der nächsten Aktualisierungsoperation werden die Metadaten automatisch aktualisiert.

Generative KI-Suche und -Antwort
Diese Antworten werden von einem großen Sprachmodell in watsonx.ai basierend auf dem Inhalt der Produktdokumentation generiert. Weitere Informationen