Lo skipping dei dati può aumentare in modo significativo le prestazioni delle query SQL ignorando oggetti di dati irrilevanti o file basati su un riepilogo dei metadati associati ad ogni oggetto.
Lo skipping dei dati utilizza la libreria Xskipper open source per la creazione, la gestione e la distribuzione degli indici di sci dati con Apache Spark. Consultare Xskipper - An Extensible Data Skipping Framework.
Per maggiori dettagli su come lavorare con Xskipper vedi:
Oltre alle funzioni open source in Xskipper sono disponibili anche le seguenti funzioni:
- Skipping dati geospaziali
- Indici di codifica
- Seggiamento dati con joins (solo per Spark 3)
- Campioni che mostrano queste funzioni
Skipping dei dati geospaziali
È inoltre possibile utilizzare lo skipping dei dati quando si interrogano i dataset geospaziali utilizzando funzioni geospaziali dalla libreria spato-temporale.
- Per beneficiare dello skipping dei dati nei dataset con colonne di latitudine e longitudine, è possibile raccogliere gli indici min / max sulle colonne di latitudine e longitudine.
- Lo skipping dei dati può essere utilizzato nei dataset con una colonna di geometria (una colonna UDT) utilizzando un plugin Xskipper integratointegrato.
Le sezioni successive mostrano di lavorare con il plugin geospaziale.
Impostazione del plugin geospaziale
Per utilizzare il plug-in, caricare le implementazioni pertinenti utilizzando il modulo Registrazione. Si noti che è possibile utilizzare Scala solo nelle applicazioni in IBM Analytics Engine powered by Apache Spark, non in watsonx.ai Studio.
Per 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)
Per 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')
Costruzione dell'indice
Per generare un indice, puoi utilizzare l'API addCustomIndex
. Si noti che è possibile utilizzare Scala solo nelle applicazioni in IBM Analytics Engine powered by Apache Spark, non in watsonx.ai Studio.
Per 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)
Per 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)
Funzioni supportate
L'elenco delle funzioni geospaziali supportate include quanto segue:
- ST_Distanza
- ST_Intersects
- ST_Contiene
- ST_Equals
- ST_Crosses
- ST_Touches
- ST_Within
- ST_Overlaps
- ST_EnvelopesIntersect
- ST_IntersectsInterior
Codifica degli indici
Se si utilizza un negozio di metadati Parquet, i metadati possono opzionalmente essere crittografati utilizzando Parquet Modular Encryption (PME). Questo si ottiene memorizzando i metadati stessi come un dataset Parquet e quindi PME può essere utilizzato per crittografarlo. Questa funzione si applica a tutti i formati di input, ad esempio, un dataset memorizzato in formato CSV può avere i suoi metadati crittografati utilizzando PME.
Nella sezione seguente, a meno che non sia specificato diversamente, quando si riferiscono a footers, colonne e così via, questi sono rispetto agli oggetti metadati, e non agli oggetti nel dataset indicizzato.
La crittografia dell'indice è modulare e granulare nel seguente modo:
- Ogni indice può essere codificato (con una granularità della chiave per indice) o lasciato in testo semplice
- Piè di pagina + nome oggetto:
- Colonna piana dell'oggetto metadati che di per sé è un file di Parquet contiene, tra le altre cose:
- Schema dell'oggetto metadati, che rivela i tipi, i parametri e i nomi delle colonne per tutti gli indici raccolti. Ad esempio, si può imparare che un
BloomFilter
è definito sulla colonnacity
con una probabilità falsata di0.1
. - Percorso completo al dataset originale o un nome da tavolo in caso di tabella metastore Hive .
- Schema dell'oggetto metadati, che rivela i tipi, i parametri e i nomi delle colonne per tutti gli indici raccolti. Ad esempio, si può imparare che un
- La colonna nome oggetto memorizza i nomi di tutti gli oggetti indicizzati.
- Colonna piana dell'oggetto metadati che di per sé è un file di Parquet contiene, tra le altre cose:
- La colonna dei metadati + può essere:
Entrambi crittografati usando la stessa chiave. Questa è l'impostazione predefinita. In questo caso, la configurazione del footer di testo semplice per gli oggetti Parquet comprendente i metadati in modalità footer crittografata e la colonna nome oggetto viene crittografata utilizzando la chiave selezionata.
Sia in testo semplice. In questo caso, gli oggetti Parquet che comprendono i metadati sono in modalità di testo semplice e la colonna nome oggetto non è crittografata.
Se almeno un indice è contrassegnato come crittografato, allora un tasto di piè di pagina deve essere configurato indipendentemente dal fatto che la modalità piè di testo semplice sia abilitata o meno. Se si imposta un footer di testo semplice allora la chiave di piè di pagina viene utilizzata solo per la manomissione. Da notare che in quel caso la colonna del nome oggetto non è manomissione.
Se un tasto di piè di pagina è configurato, allora almeno un indice deve essere crittografato.
Prima di utilizzare la crittografia dell'indice, è necessario controllare la documentazione su PME e assicurarsi di conoscere i concetti.
key
è configurato in una qualsiasi API Xskipper, è sempre l'etichetta ` MAI la chiave stessa `.Per utilizzare la crittografia dell'indice:
Segui tutti i passaggi per assicurarsi che PME sia abilitato. Vedere PME.
Eseguire tutte le configurazioni regolari PME, incluse le configurazioni di Key Management.
Creare metadati crittografati per un dataset:
- Segui il flusso regolare per la creazione dei metadati.
- Configurare un tasto di piè di pagina. Se desideri impostare una colonna di testo semplice + colonna nome oggetto, impostare
io.xskipper.parquet.encryption.plaintext.footer
sutrue
(Vedi i campioni sotto). - In
IndexBuilder
, per ogni indice che si desidera cifrare, aggiungere l'etichetta della chiave da utilizzare per quell' indice.
Per utilizzare i metadati durante il tempo della query o per aggiornare i metadati esistenti, non è necessario alcun setup diverso dal setup di regolare PME necessario per assicurarsi che le chiavi siano accessibili (letteralmente la stessa configurazione necessaria per leggere un dataset crittografato).
Esempi
I seguenti campioni mostrano la creazione di metadati utilizzando una chiave denominata k1
come chiave nome oggetto + e una chiave denominata k2
come chiave per crittografare un MinMax
per temp
, creando anche un ValueList
per city
, che viene lasciato in chiaro testo. Si noti che è possibile utilizzare Scala solo nelle applicazioni in IBM Analytics Engine powered by Apache Spark, non in watsonx.ai Studio.
Per 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)
Per 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)
Se si desidera che il piè di pagina + nome oggetto venga lasciato in modalità testo semplice (come detto sopra), è necessario aggiungere il parametro di configurazione:
Per 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)
Per 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)
Data skipping con joins (solo per Spark 3)
Con Spark 3 è possibile utilizzare lo skipping dei dati in query di unione come:
SELECT *
FROM orders, lineitem
WHERE l_orderkey = o_orderkey and o_custkey = 800
Questo esempio mostra uno schema star basato sullo schema benchmark TPC-H (vedi TPC - H) dove lineitem è un dato di fatto e contiene molti record, mentre la tabella degli ordini è una tabella di dimensioni che ha un numero relativamente ridotto di record rispetto alle tabelle dei fatti.
La query di cui sopra ha un predicato sulle tabelle degli ordini che contiene un numero ridotto di record che significa utilizzare min / max non beneficerà molto dello skipping dei dati.
Skipping dei dati dinamici è una funzione che consente alle query come quelle di cui sopra di beneficiare dello skipping dei dati estraendo per la prima volta i relativi l_orderkey
valori in base alla condizione sulla tabella orders
e quindi di utilizzarlo per spingere verso il basso un predicato su l_orderkey
che utilizza gli indici di skipping dei dati per filtrare oggetti irrilevanti.
Per utilizzare questa funzione, abilitare la seguente regola di ottimizzazione. Si noti che è possibile utilizzare Scala solo nelle applicazioni in IBM Analytics Engine powered by Apache Spark, non in watsonx.ai Studio.
Per Scala:
import com.ibm.spark.implicits. spark.enableDynamicDataSkipping()
Per Python:
from sparkextensions import SparkExtensions SparkExtensions.enableDynamicDataSkipping(spark)
Quindi utilizzare l'API Xskipper come di consueto e le vostre query beneficeranno dell'utilizzo dello skipping dei dati.
Ad esempio, nella query sopra riportata, l'indicizzazione l_orderkey
tramite min / max abiliterà lo sci sulla tabella lineitem
e migliorerà le prestazioni della query.
Supporto per i metadati più anziani
Xskipper supporta i metadati più vecchi creati daMetaIndexManager senza soluzione di continuità. I metadati più vecchi possono essere utilizzati per lo sci come aggiornamenti ai metadati Xskipper vengono effettuati automaticamente dalla prossima operazione di aggiornamento.
Se si vede DEPRECATED_SUPPORTED
davanti ad un indice quando elencare gli indici o eseguire un'operazione describeIndex
, la versione dei metadati è obsoleta ma è comunque supportata e lo skipping funzionerà. La prossima operazione di aggiornamento aggiornerà automaticamente i metadati.
Argomento principale: Notebook e script