0 / 0
Go back to the English version of the documentation
Přeskočení dat pro SQL Spark
Last updated: 28. 9. 2023
Přeskočení dat pro SQL Spark

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

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 sloupci city 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 .
    • Ve sloupci Název objektu jsou uloženy názvy všech indexovaných objektů.
  • 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.

Důležité: Při použití šifrování indexu, kdykoli je v jakémkoli rozhraní Xskipper API nakonfigurován ` klíč `, je to vždy štítek ` NIKDY samotný klíč `.

Chcete-li použít šifrování indexu, postupujte takto:

  1. Postupujte podle všech kroků, abyste se ujistili, že je PME povoleno. Viz PME.

  2. Proveďte všechny běžné konfigurace PME, včetně konfigurací správy klíčů.

  3. Vytvořit šifrovaná metadata pro datovou sadu:

    1. Při vytváření metadat postupujte podle pravidelného toku.
    2. Nakonfigurujte klíč zápatí. Chcete-li nastavit sloupec zápatí prostého textu + název objektu, nastavte io.xskipper.parquet.encryption.plaintext.footer na hodnotu true (viz níže uvedené ukázky).
    3. V souboru IndexBuilderpř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 tempa 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.

Generative AI search and answer
These answers are generated by a large language model in watsonx.ai based on content from the product documentation. Learn more