0 / 0
Go back to the English version of the documentation
Vynechávání dat pro modul Spark SQL
Last updated: 29. 9. 2023
Vynechávání dat pro modul Spark SQL

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:

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 sloupci city 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 .
    • Ve sloupci s názvem objektu jsou uložena jména všech indexovaných objektů.
  • 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.

Důležité: Při použití šifrování indexu je vždy, když je v rozhraní API Xskipper nakonfigurován,,, klíč ` `, vždy popisek "NIKDY sám".

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

  1. Postupujte podle všech kroků a ujistěte se, že je povoleno PME. Viz PME.

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

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

    1. Postupujte podle pravidelného toku a vytvořte metadata.
    2. Nakonfigurujte klíč zápatí. Chcete-li nastavit sloupec s prostým textem + sloupce názvu objektu, nastavte io.xskipper.parquet.encryption.plaintext.footer na hodnotu true (Viz ukázky níže).
    3. V produktu IndexBuilderpř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

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