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
- Verschlüsseln von Indizes
- Daten werden mit Joins übersprungen (nur für Spark 3)
- Beispiele mit diesen Features
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
BloomFilter
in Spaltecity
mit einer falsch-positiven Wahrscheinlichkeit von0.1
definiert ist. - Der vollständige Pfad zur ursprünglichen Datei oder zum Tabellennamen im Fall einer Hive-Metaspeichertabelle.
- Schema des Metadatenobjekts, das die Typen, Parameter und Spaltennamen für alle erfassten Indizes enthüllt. Sie können beispielsweise erkennen, dass eine
- In der Objektnamensspalte werden die Namen aller indexierten Objekte gespeichert.
- Die Footer-Spalte des Metadatenobjekts, das an sich eine Parquet-Datei ist, enthält unter anderem:
- 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.
key
in einer Xskipper-API konfiguriert ist, immer die Bezeichnung 'NEVER der Schlüssel selbst'.So verwenden Sie die Indexverschlüsselung:
Führen Sie alle Schritte aus, um sicherzustellen, dass PME aktiviert ist. Siehe PME.
Führen Sie alle Regulär -PME-Konfigurationen aus, einschließlich Schlüsselmanagementkonfigurationen.
Erstellen Sie verschlüsselte Metadaten für eine Datei:
- Folgen Sie dem regulären Ablauf zum Erstellen von Metadaten.
- Konfigurieren Sie einen Fußzeilenschlüssel. Wenn Sie eine einfache Textfußzeile + Objektnamensspalte festlegen möchten, setzen Sie
io.xskipper.parquet.encryption.plaintext.footer
auftrue
(siehe Beispiele unten). - Fügen Sie in
IndexBuilder
fü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 k1
als Fußzeile + Objektnamensschlüssel und eines Schlüssels mit dem Namen k2
als Schlüssel zur Verschlüsselung eines MinMax
für temp
, während gleichzeitig ein ValueList
für city
erstellt 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_SUPPORTED
vor 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.