Translation not up to date
Přeskočení dat může významně zvýšit výkon dotazů SQL přeskakováním irelevantních datových objektů nebo souborů na základě souhrnných metadat přidružených ke každému objektu.
Vynechání dat používá knihovnu Xskipper s otevřeným zdrojovým kódem pro vytváření, správu a implementaci indexů pro vynechání dat pomocí produktu Apache Spark. Viz Xskipper-rámec pro vynechání rozšiřitelných dat.
Pro více informací o tom, jak pracovat s Xskipper viz:
Kromě funkcí open source v Xskipper jsou k dispozici také následující funkce:
- Vynechání geoprostorových dat
- Šifrování indexů
- Vynechání dat se spojeními (pouze pro Spark 3)
- Ukázky zobrazující tyto funkce
Vynechání geoprostorových dat
Můžete také použít vynechání dat při dotazování na sady geoprostorových dat pomocí geoprostorových funkcí z časoprostorové knihovny.
- Chcete-li těžit z vynechání dat v datových sadách se sloupci zeměpisné šířky a délky, můžete shromáždit indexy min/max pro sloupce zeměpisné šířky a délky.
- Vynechání dat lze použít v datových sadách se sloupcem geometrie (sloupec UDT) pomocí vestavěného modulu plug-in Xskipper.
Další části vám ukážou, jak pracovat s geoprostorovým modulem plug-in.
Nastavení geoprostorového modulu plug-in
Chcete-li použít modul plug-in, načtěte příslušné implementace pomocí modulu Registrace. Všimněte si, že Scala můžete použít pouze v aplikacích v produktu IBM Analytics Engine powered by Apache Spark, ne v produktu Watson Studio.
Pro společnost 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)
Pro 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')
Sestavování indexu
Chcete-li sestavit index, můžete použít rozhraní API addCustomIndex
. Všimněte si, že Scala můžete použít pouze v aplikacích v produktu IBM Analytics Engine powered by Apache Spark, ne v produktu Watson Studio.
Pro společnost 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)
Pro 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)
Podporované funkce
Seznam podporovaných geoprostorových funkcí zahrnuje následující:
- ST_Distance-vzdálenost
- ST_Intersects
- ST_Obsahuje
- ST_Equals se rovná
- ST_Crosses-křížky
- ST_Touches (Doteky)
- ST_Within
- Přesahy STT_Overlaps
- ST_EnvelopesIntersect
- ST_IntersectsInterior
Šifrování indexů
Pokud používáte úložiště metadat Parquet, metadata lze volitelně šifrovat pomocí PME (Parket Modular Encryption). Toho je dosaženo uložením samotných metadat jako datové sady Parquet, a proto lze PME použít k jejich zašifrování. Tato funkce se vztahuje na všechny vstupní formáty, například datová sada uložená ve formátu CSV může mít svá metadata zašifrovaná pomocí PME.
Není-li v následující části uvedeno jinak, při odkazování na zápatí, sloupce atd. se jedná o objekty metadat, nikoli o objekty v indexované datové sadě.
Šifrování indexu je modulární a granulované následujícím způsobem:
- Každý index může být buď zašifrován (s granularitou podle klíče indexu), nebo ponechán v prostém textu
- Sloupec zápatí + název objektu:
- Sloupec zápatí objektu metadat, který je sám o sobě souborem Parquet, obsahuje mimo jiné:
- Schéma objektu metadat, které odhaluje typy, parametry a názvy sloupců pro všechny shromážděné indexy. Můžete se například dozvědět, že
BloomFilter
je definován ve sloupcicity
s falešně kladnou pravděpodobností0.1
. - Úplná cesta k původní datové sadě nebo název tabulky v případě tabulky metaúložiště Hive .
- Schéma objektu metadat, které odhaluje typy, parametry a názvy sloupců pro všechny shromážděné indexy. Můžete se například dozvědět, že
- Ve sloupci Název objektu jsou uloženy názvy všech indexovaných objektů.
- Sloupec zápatí objektu metadat, který je sám o sobě souborem Parquet, obsahuje mimo jiné:
- Sloupec zápatí + metadat může být:
Obojí šifrováno pomocí stejného klíče. Jedná se o výchozí nastavení. V tomto případě je konfigurace zápatí prostého textu pro objekty Parquet obsahující metadata v režimu šifrovaného zápatí a sloupec názvu objektu je šifrován pomocí vybraného klíče.
Obojí v prostém textu. V tomto případě jsou objekty Parquet obsahující metadata v režimu zápatí prostého textu a sloupec názvu objektu není šifrován.
Je-li alespoň jeden index označen jako šifrovaný, musí být nakonfigurován klíč zápatí bez ohledu na to, zda je povolen režim zápatí prostého textu. Je-li nastaveno zápatí s prostým textem, pak se klíč zápatí používá pouze pro nátisk. Všimněte si, že v tomto případě není sloupec názvu objektu nezobrazený.
Je-li konfigurován klíč zápatí, musí být šifrován alespoň jeden index.
Před použitím šifrování indexu byste měli zkontrolovat dokumentaci na PME a ujistit se, že jste obeznámeni s koncepty.
Chcete-li použít šifrování indexu, postupujte takto:
Postupujte podle všech kroků, abyste se ujistili, že je PME povoleno. Viz PME.
Proveďte všechny běžné konfigurace PME, včetně konfigurací správy klíčů.
Vytvořit šifrovaná metadata pro datovou sadu:
- Při vytváření metadat postupujte podle pravidelného toku.
- Nakonfigurujte klíč zápatí. Chcete-li nastavit sloupec zápatí prostého textu + název objektu, nastavte
io.xskipper.parquet.encryption.plaintext.footer
na hodnotutrue
(viz níže uvedené ukázky). - V souboru
IndexBuilder
přidejte pro každý index, který chcete šifrovat, popisek klíče, který má být pro tento index použit.
Chcete-li používat metadata během doby dotazu nebo aktualizovat existující metadata, není nutné žádné jiné nastavení než běžné nastavení PME potřebné k zajištění dostupnosti klíčů (doslova stejná konfigurace potřebná ke čtení šifrované datové sady).
Ukázky
Následující ukázky ukazují vytvoření metadat s použitím klíče s názvem k1
jako klíče zápatí + názvu objektu a klíče s názvem k2
jako klíče pro šifrování MinMax
pro temp
a zároveň vytvoření klíče ValueList
pro city
, který je ponechán v prostém textu. Všimněte si, že Scala můžete použít pouze v aplikacích v produktu IBM Analytics Engine powered by Apache Spark, ne v produktu Watson Studio.
Pro společnost 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)
Pro 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)
Pokud chcete, aby bylo zápatí + název objektu ponecháno v režimu prostého textu (jak je uvedeno výše), musíte přidat konfigurační parametr:
Pro společnost 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)
Pro 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)
Přeskakování dat se spojeními (pouze pro Spark 3)
S produktem Spark 3 můžete přeskakovat data v dotazech spojení typu join, například:
SELECT *
FROM orders, lineitem
WHERE l_orderkey = o_orderkey and o_custkey = 800
Tento příklad ukazuje hvězdicové schéma založené na srovnávacím schématu TPC-H (viz TPC-H), kde položka řádku je tabulka faktů a obsahuje mnoho záznamů, zatímco tabulka objednávek je tabulka dimenzí, která má relativně malý počet záznamů v porovnání s tabulkami faktů.
Výše uvedený dotaz má predikát na tabulkách objednávek, který obsahuje malý počet záznamů, což znamená, že použití min/max nebude mít velký prospěch z přeskočení dat.
Dynamické přeskakování dat je funkce, která umožňuje dotazům, jako je výše uvedený, využívat přeskakování dat tím, že nejprve extrahuje příslušné hodnoty l_orderkey
na základě podmínky v tabulce orders
a poté je používá k posunu predikátu v systému l_orderkey
, který používá indexy pro přeskakování dat k filtrování irelevantních objektů.
Chcete-li použít tuto funkci, povolte následující pravidlo optimalizace. Všimněte si, že Scala můžete použít pouze v aplikacích v produktu IBM Analytics Engine powered by Apache Spark, ne v produktu Watson Studio.
Pro společnost Scala:
import com.ibm.spark.implicits. spark.enableDynamicDataSkipping()
Pro Python:
from sparkextensions import SparkExtensions SparkExtensions.enableDynamicDataSkipping(spark)
Pak použijte rozhraní Xskipper API jako obvykle a vaše dotazy budou mít prospěch z použití vynechání dat.
Například ve výše uvedeném dotazu indexace l_orderkey
používající min/max povolí přeskočení tabulky lineitem
a zlepší výkon dotazu.
Podpora starších metadat
Produkt Xskipper podporuje starší metadata vytvořená správcem MetaIndexManager bez problémů. Starší metadata lze použít k přeskočení, protože aktualizace metadat Xskipper jsou prováděny automaticky při příští operaci aktualizace.
Pokud se při výpisu indexů nebo spuštění operace describeIndex
před indexem zobrazí hodnota DEPRECATED_SUPPORTED
, verze metadat je zamítnuta, ale je stále podporována a přeskočení bude fungovat. Další operace aktualizace automaticky aktualizuje metadata.