Translation not up to date
Vynechávání dat může výrazně zvýšit výkon dotazů SQL vynecháním nerelevantních datových objektů nebo souborů na základě souhrnných metadat přidružených ke každému objektu.
Vynechávání dat používá knihovnu Xskipper typu open source pro vytváření, správu a implementaci dat s vynecháním indexů s produktem Apache Spark. Viz XSkipper-Extensible Data Skipping Framework.
Pro více informací o tom, jak pracovat s XSkipper viz:
Kromě open source funkcí v XSkipper, následující funkce jsou také k dispozici:
- Vynechávání geoprostorových dat
- Šifrování indexů
- Vynechávání dat se spojeními (pouze pro modul Spark 3)
- Ukázky zobrazující tyto funkce
Geografická data vynechávají
Vynechávání dat můžete také použít při dotazování datových sad geoprostorových dat pomocí geografických funkcí z spatio-temporary library.
- Chcete-li využívat data vynechávání v datových sadách se sloupci zeměpisné šířky a délky, můžete ve sloupcích zeměpisné šířky a délky shromáždit minimální/maximální indexy.
- Vynechávání dat lze použít v datových sadách se sloupcem geometrie (sloupec UDT) s použitím vestavěného modulu Xskipper plugin.
Následující sekce vám ukážou práci s geoprostorovým pluginem.
Nastavení geoprostorového modulu
Chcete-li modul plug-in použít, načtěte příslušné implementace pomocí modulu Registrace. Všimněte si, že aplikace lze použít pouze v aplikacích v produktu IBM Analytics Engine , které je založeno na produktu Apache Spark, nikoli v aplikaci Watson Studio.
Pro 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')
Sestavení indexu
Chcete-li sestavit index, můžete použít rozhraní API produktu addCustomIndex
. Všimněte si, že aplikace lze použít pouze v aplikacích v produktu IBM Analytics Engine , které je založeno na produktu Apache Spark, nikoli v aplikaci Watson Studio.
Pro 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 geografických funkcí obsahuje následující:
- ST_Vzdálenost
- ST_Intersects
- ST_Obsahuje
- Je rovno
- ST_Křížové
- ST_Touches
- ST_V
- Počet překrytí
- ST_EnvelopesIntersect
- ST_IntersectsInterior
Šifrování indexů
Používáte-li úložiště metadat Parquet, metadata mohou být volitelně šifrována pomocí Parquet Modular Encryption (PME). Toho se dosáhne uložením samotných metadat jako datové sady Parquet, a proto ji lze použít k zašifrování PME. Tato funkce se vztahuje na všechny vstupní formáty, například datová sada uložená ve formátu CSV může mít metadata zašifrovaná pomocí PME.
V následující sekci, pokud není určeno jinak, při odkazování na zápatí, sloupce atd. se jedná o objekty metadat a ne k objektům v indexované datové sadě.
Šifrování indexu je modulární a granulární v následujícím způsobu:
- Každý index může být buď šifrován (s jednou indexem, granularity klíče), nebo zanechán v prostém textu.
- Sloupec názvu objektu + patička:
- Sloupec zápatí objektu metadat, který je sám o sobě souborem Parquet, obsahuje kromě jiného:
- Schéma objektu metadat, který odhaluje typy, parametry a názvy sloupců pro všechny shromážděné indexy. Například se můžete dozvědět, že
BloomFilter
je definován ve sloupcicity
s falešně pozitivní pravděpodobností0.1
. - Úplná cesta k původní datové sadě nebo k názvu 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. Například se můžete dozvědět, že
- Ve sloupci s názvem objektu jsou uložena jména všech indexovaných objektů.
- Sloupec zápatí objektu metadat, který je sám o sobě souborem Parquet, obsahuje kromě jiného:
- Sloupec zápatí + metadata může být buď:
Oba šifrovány 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 šifrovaném režimu zápatí a sloupec názvu objektu je šifrováno pomocí vybraného klíče.
Obojí v prostém textu. V tomto případě jsou objekty Parquet obsahující metadata v režimu prostého textu v režimu prostého textu a sloupec názvu objektu není šifrován.
Je-li alespoň jeden index označen jako zašifrovaný, musí být klíč zápatí konfigurován bez ohledu na to, zda je režim zápatí prostého textu povolen nebo ne. Je-li nastaveno zarovnání prostého textu, bude klíč zápatí použit pouze pro ochranu proti neoprávněným zásahům. Všimněte si, že v takovém případě sloupec s názvem objektu není odolné proti nedovolené manipulaci.
Je-li klíč zápatí konfigurován, 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 koncepcemi.
Chcete-li použít šifrování indexu:
Postupujte podle všech kroků a ujistěte se, že je povoleno PME. Viz PME.
Proveďte všechny běžné konfigurace PME, včetně konfigurací správy klíčů.
Vytvořte šifrovaná metadata pro datovou sadu:
- Postupujte podle pravidelného toku a vytvořte metadata.
- Nakonfigurujte klíč zápatí. Chcete-li nastavit sloupec s prostým textem + sloupce názvu objektu, nastavte
io.xskipper.parquet.encryption.plaintext.footer
na hodnotutrue
(Viz ukázky níže). - V produktu
IndexBuilder
přidejte pro každý index, který chcete šifrovat, popisek klíče, který má být použit pro daný index.
Chcete-li použít metadata během dotazování nebo obnovit existující metadata, není nutné nastavení jiného nastavení než normální PME nastavení, aby bylo zajištěno, že jsou klíče přístupné (doslovně stejná konfigurace potřebná ke čtení šifrované datové sady).
Ukázky
Následující ukázky zobrazují vytvoření metadat s použitím klíče s názvem k1
jako klíče názvu objektu a klíčem s názvem k2
jako klíče pro šifrování MinMax
pro temp
, při vytváření ValueList
pro city
, který je ponechán v prostém textu. Všimněte si, že aplikace lze použít pouze v aplikacích v produktu IBM Analytics Engine , které je založeno na produktu Apache Spark, nikoli v aplikaci Watson Studio.
Pro 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 byl název objektu zápatí + ponechán v režimu prostého textu (jak je uvedeno výše), musíte přidat konfigurační parametr:
Pro 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)
Vynechávání dat se spojeními (pouze pro Spark 3)
S Spark 3 můžete použít data přeskočení v dotazech spojení jako jsou:
SELECT *
FROM orders, lineitem
WHERE l_orderkey = o_orderkey and o_custkey = 800
Tento příklad ukazuje hvězdicové schéma založené na schématu srovnávacího testu 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ů ve srovnání s tabulkami faktů.
Výše uvedený dotaz má predikát na tabulkách objednávek, které obsahují malý počet záznamů, což znamená, že použití min/max nebude z přeskakování dat využívat mnoho výhod.
Dynamické vynechání dat je funkce, která umožňuje takovým dotazům, jako jsou výše uvedené, využívat data vynechaní tak, že nejprve extrahují příslušné hodnoty l_orderkey
založené na podmínce na tabulce orders
a pak ji používají k protlačení predikátu na l_orderkey
, který používá data, která vynechávají indexy k filtrování nepodstatných objektů.
Chcete-li tuto funkci použít, povolte následující pravidlo optimalizace. Všimněte si, že aplikace lze použít pouze v aplikacích v produktu IBM Analytics Engine , které je založeno na produktu Apache Spark, nikoli v aplikaci Watson Studio.
Pro Scala:
import com.ibm.spark.implicits. spark.enableDynamicDataSkipping()
Pro Python:
from sparkextensions import SparkExtensions SparkExtensions.enableDynamicDataSkipping(spark)
Pak použijte Xskipper API jako obvykle a vaše dotazy budou mít prospěch z použití dat vynechává.
Například ve výše uvedeném dotazu bude indexování l_orderkey
za použití min/max povoleno přeskakování přes tabulku lineitem
a zlepší se výkon dotazu.
Podpora pro starší metadata
Xskipper podporuje starší metadata vytvořená Správcem MetaIndexbez problémů. Starší metadata mohou být použita pro přeskočení, protože aktualizace metadat Xskipper se provádí automaticky při další operaci aktualizace.
Pokud se při výpisu indexů nebo spuštění operace describeIndex
zobrazí DEPRECATED_SUPPORTED
v přední části indexu, je verze metadat zamítnuta, ale stále je podporována a přeskočení bude fungovat. Při další operaci aktualizace budou metadata aktualizována automaticky.
Nadřízené téma: Notebooky a skripty