0 / 0
Go back to the English version of the documentation
Spark SQL için veri atlanıyor
Last updated: 28 Eyl 2023
Spark SQL için veri atlanıyor

Verilerin atlanması, her bir nesneyle ilişkili özet meta verilere dayalı olarak ilgisiz veri nesnelerinin ya da dosyaların üzerinden atlanarak SQL sorgularının performansını önemli ölçüde artırabilir.

Veri atlama, Apache Sparkile veri atlama dizinleri oluşturmak, yönetmek ve devreye almak için açık kaynak Xskipper kitaplığını kullanır. Bkz. Xskipper-Genişletilebilir Bir Veri Atlama Çerçevesi.

Xskipper ile nasıl çalışılacağına ilişkin daha fazla ayrıntı için bkz:

Xskipper 'daki açık kaynak özelliklerine ek olarak aşağıdaki özellikler de kullanılabilir:

Jeo-uzamsal veri atlanıyor

Ayrıca, uzay-zamansal kitaplıktan jeo-uzamsal işlevleri kullanarak jeo-uzamsal veri kümelerini sorgularken de veri atlama özelliğini kullanabilirsiniz.

  • Enlem ve boylam sütunlarıyla veri kümelerinde atlanan verilerden yararlanmak için enlem ve boylam sütunlarında minimum/maksimum dizinleri toplayabilirsiniz.
  • Veri atlama, yerleşik bir Xskipper eklentisikullanılarak geometri sütunu (UDT sütunu) olan veri kümelerinde kullanılabilir.

Sonraki bölümlerde jeo-uzamsal eklentiyle çalışmanız gösterilir.

Jeo-uzamsal eklentinin ayarlanması

Eklentiyi kullanmak için, Kayıt modülünü kullanarak ilgili uygulamaları yükleyin. Watson Studio' da değil, yalnızca Apache Sparktarafından desteklenen IBM Analytics Engine içindeki uygulamalarda Scala 'yı kullanabildiğinizi unutmayın.

  • Scala için:

    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)
    
  • Pythoniçin:

    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')
    

Dizin oluşturma

Bir dizin oluşturmak için addCustomIndex API 'sini kullanabilirsiniz. Watson Studio' da değil, yalnızca Apache Sparktarafından desteklenen IBM Analytics Engine içindeki uygulamalarda Scala 'yı kullanabildiğinizi unutmayın.

  • Scala için:

    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)
    
  • Pythoniçin:

    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)
    

Desteklenen İşlevler

Desteklenen jeo-uzamsal işlevlerin listesi aşağıdakileri içerir:

  • ST_Uzaklık
  • ST_Kesşimler
  • ST_İçerir
  • ST_Eşit
  • ST_Çapraz
  • ST_Dokunmalar
  • ST_İç
  • ST_Çakışmalar
  • ST_EnvelopesIntersect
  • ST_IntersectsInterior

Dizinleri şifreleme

Bir Parke meta veri deposu kullanıyorsanız, meta veriler isteğe bağlı olarak Parke Modüler Şifreleme (PME) kullanılarak şifrelenebilir. Bu, meta verilerin kendisini bir Parke veri kümesi olarak depolayarak elde edilir ve böylece PME onu şifrelemek için kullanılabilir. Bu özellik tüm giriş biçimleri için geçerlidir; örneğin, CSV biçiminde saklanan bir veri kümesinin meta verileri PME kullanılarak şifrelenebilir.

Aşağıdaki bölümde, aksi belirtilmedikçe, altbilgilere, sütunlara vb. başvurulduğunda, bunlar meta veri nesnelerine göre olur ve dizinlenen veri kümesindeki nesnelere göre değildir.

Dizin şifrelemesi aşağıdaki şekilde modüler ve ayrıntılıdır:

  • Her dizin şifrelenebilir (dizin başına anahtar ayrıntı düzeyi ile) ya da düz metin olarak bırakılabilir
  • Altbilgi + nesne adı sütunu:
    • Diğer şeylerin yanı sıra, kendisi bir Parke dosyası olan meta veri nesnesinin altbilgi sütunu şunları içerir:
      • Toplanan tüm dizinlere ilişkin tipleri, parametreleri ve kolon adlarını gösteren meta veri nesnesinin şeması. Örneğin, bir BloomFilter öğesinin city kolonunda 0.1yanlış pozitif olasılığına sahip olarak tanımlandığını öğrenebilirsiniz.
      • Hive meta depo tablosu olması durumunda, özgün veri kümesinin ya da tablo adının tam yolu.
    • Nesne adı sütunu, dizinlenen tüm nesnelerin adlarını saklar.
  • Altbilgi + meta veri sütunu aşağıdakilerden biri olabilir:
    • İkisi de aynı anahtar kullanılarak şifrelenmiş. Bu varsayılandır. Bu durumda, şifrelenmiş altbilgi kipinde meta verileri oluşturan Parke nesnelere ilişkin düz metin altbilgisi yapılandırması ve nesne adı sütunu seçilen anahtar kullanılarak şifrelenir.

    • İkisi de düz metin olarak. Bu durumda, meta verileri oluşturan Parke nesneler düz metin altbilgi kipindedir ve nesne adı sütunu şifrelenmez.

      En az bir dizin şifrelenmiş olarak işaretliyse, düz metin altbilgi kipinin etkinleştirilip etkinleştirilmediğine bakılmaksızın bir altbilgi anahtarı yapılandırılmalıdır. Düz metin altbilgisi ayarlanırsa, altbilgi anahtarı yalnızca kurcalama yalıtımı için kullanılır. Bu durumda, nesne adı sütununun kurcalama korumalı olmadığını unutmayın.

      Bir altbilgi anahtarı yapılandırıldıysa, en az bir dizin şifrelenmelidir.

Dizin şifrelemeyi kullanmadan önce, PME üzerindeki belgeleri denetlemeli ve kavramları bildiğinizden emin olmalısınız.

Önemli: Dizin şifrelemesi kullanılırken, herhangi bir Xskipper API 'sinde bir ` key ` yapılandırıldığında, her zaman ` anahtarın kendisini HİÇBİR ZAMAN ' etiketi olur.

Dizin şifrelemesini kullanmak için:

  1. PME ' nin etkinleştirildiğinden emin olmak için tüm adımları izleyin. Bkz. PME.

  2. Anahtar Yönetimi yapılandırmaları da içinde olmak üzere tüm olağan PME yapılandırmalarını gerçekleştirin.

  3. Bir veri kümesi için şifrelenmiş meta veri yarat:

    1. Meta veri yaratmak için olağan akışı izleyin.
    2. Bir altbilgi anahtarı yapılandırın. Bir düz metin altbilgisi + nesne adı sütunu ayarlamak istiyorsanız, io.xskipper.parquet.encryption.plaintext.footer değerini true olarak ayarlayın (Aşağıdaki örneklere bakın).
    3. IndexBuilderiçinde, şifrelemek istediğiniz her dizin için, o dizin için kullanılacak anahtarın etiketini ekleyin.

    Sorgu süresi boyunca meta verileri kullanmak ya da var olan meta verileri yenilemek için, anahtarların erişilebilir olduğundan emin olmak için gerekli normal PME kurulumundan başka bir ayarlama gerekmez (şifrelenmiş bir veri kümesini okumak için tam olarak aynı yapılandırma).

Örnekler

Aşağıdaki örneklerde, altbilgi + nesne adı anahtarı olarak k1 adlı bir anahtar ve tempiçin MinMax şifrelemek üzere bir anahtar olarak k2 adlı bir anahtar kullanılarak meta veri oluşturma gösterilmektedir; aynı zamanda düz metinde bırakılmış bir ValueList for cityoluşturur. Watson Studio' da değil, yalnızca Apache Sparktarafından desteklenen IBM Analytics Engine içindeki uygulamalarda Scala 'yı kullanabildiğinizi unutmayın.

  • Scala için:

    // 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)
    
  • Python için

    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)
    

Altbilgi + nesne adının düz metin kipinde bırakılmasını istiyorsanız (yukarıda belirtildiği gibi), yapılandırma parametresini eklemeniz gerekir:

  • Scala için:

    // 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)
    
  • Python için

    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)
    

Birleştirmeler ile veri atlanıyor (yalnızca Spark 3 için)

Spark 3 ile aşağıdaki gibi birleştirme sorgularında veri atlama özelliğini kullanabilirsiniz:

SELECT *
FROM orders, lineitem 
WHERE l_orderkey = o_orderkey and o_custkey = 800

Bu örnek, satır öğesinin bir olgu tablosu olduğu ve birçok kayıt içerdiği TPC-H karşılaştırmalı değerlendirme şemasına (bkz. TPC-H) dayalı bir yıldız şemasını gösterirken, sipariş tablosu olgu tablolarıyla karşılaştırıldığında nispeten az sayıda kaydı olan bir boyut tablosunu gösterir.

Yukarıdaki sorgu, az sayıda kayıt içeren sipariş tablolarında bir karşılaştırma belirtimi içeriyor; bu, min/max kullanımının veri atlamadan çok yararlanmayacağı anlamına gelir.

Dinamik veri atlama , yukarıdaki gibi sorguların önce orders tablosundaki koşula dayalı olarak ilgili l_orderkey değerlerini ayıklayarak ve daha sonra, ilgisiz nesneleri süzgeçten geçirmek için veri atlama dizinlerini kullanan l_orderkey üzerinde bir karşılaştırma belirtimini aşağı itmek için bunu kullanarak veri atlamadan yararlanmasını sağlayan bir özelliktir.

Bu özelliği kullanmak için aşağıdaki eniyileme kuralını etkinleştirin. Watson Studio' da değil, yalnızca Apache Sparktarafından desteklenen IBM Analytics Engine içindeki uygulamalarda Scala 'yı kullanabildiğinizi unutmayın.

  • Scala için:

      import com.ibm.spark.implicits.
    
      spark.enableDynamicDataSkipping()
    
  • Pythoniçin:

        from sparkextensions import SparkExtensions
    
        SparkExtensions.enableDynamicDataSkipping(spark)
    

Daha sonra, her zamanki gibi Xskipper API ' yı kullanın ve sorgularınız veri atlamanın kullanılmasından yararlanacaktır.

Örneğin, yukarıdaki sorguda, l_orderkey dizinlemesi min/max kullanılarak lineitem çizelgesinin üzerinden atlanır ve sorgu başarımını yükseltir.

Daha eski meta veriler için destek

Xskipper, MetaIndexManager tarafından sorunsuz bir şekilde oluşturulan eski meta verileri destekler. Xskipper meta verilerine ilişkin güncellemeler sonraki yenileme işlemi tarafından otomatik olarak gerçekleştirildiğinden, daha eski meta veriler atlamak için kullanılabilir.

Dizinleri listelerken ya da bir describeIndex işlemini çalıştırırken dizinin önünde DEPRECATED_SUPPORTED görürseniz, meta veri sürümü kullanımdan kaldırılır, ancak yine de desteklenir ve atlamak işe yarar. Sonraki yenileme işlemi meta verileri otomatik olarak günceller.

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