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:
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
Copy link to section
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.
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')
Copy to clipboardIn die Zwischenablage kopiert
Indexerstellung
Copy link to section
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 datasetval xskipper = newXskipper(spark, dataset_path)
xskipper
.indexBuilder()
// using the implicit method defined in the plugin implicits
.addSTBoundingBoxLocationIndex("location")
// equivalent//.addCustomIndex(STBoundingBoxLocationIndex("location"))
.build(reader).show(false)
Copy to clipboardIn die Zwischenablage kopiert
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)
Copy to clipboardIn die Zwischenablage kopiert
Unterstützte Funktionen
Copy link to section
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
Copy link to section
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:
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.footerauf true(siehe Beispiele unten).
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
Copy link to section
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 datasetval xskipper = newXskipper(spark, dataset_path)
// Configuring the JVM wide parametersval jvmComf = Map(
"io.xskipper.parquet.mdlocation" -> md_base_location,
"io.xskipper.parquet.mdlocation.type" -> "EXPLICIT_BASE_PATH_LOCATION")
Xskipper.setConf(jvmConf)
// set the footer keyval 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)
Copy to clipboardIn die Zwischenablage kopiertShow more
Daten werden mit Joins übersprungen (nur für Spark 3)
Copy link to section
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
Copy to clipboardIn die Zwischenablage kopiert
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.
from sparkextensions import SparkExtensions
SparkExtensions.enableDynamicDataSkipping(spark)
Copy to clipboardIn die Zwischenablage kopiert
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
Copy link to section
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.