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 georäumliche Datasets mit georäumlichen Funktionen aus der räumlich-zeitlichen Bibliothekabfragen.
- 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 (UDT-Spalte) verwendet werden, indem ein integriertes Xskipper-Plug-inverwendet wird.
In den nächsten Abschnitten wird gezeigt, dass Sie mit dem Geospatial-Plug-in arbeiten.
Geospatial-Plug-in einrichten
Um ein Plugin zu verwenden, laden Sie die entsprechenden Implementierungen mit dem Registrierungsmodul:
-
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
Um einen Index zu erstellen, können Sie die API addCustomIndexverwenden:
-
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 folgenden geografisch-räumlichen Funktionen werden unterstützt:
- 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 (mit einer Indexgranularität pro Index) oder mit einem linken Klartext (Klartext) 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 Spaltecitymit einer falsch-positiven Wahrscheinlichkeit von0.1definiert 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.
Wenn bei Verwendung der Indexverschlüsselung ein keyin einer Xskipper-API konfiguriert wird, ist es immer die Bezeichnung NEVER the key itself.
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.footerauftrue(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
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.
-
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)
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.