Translation not up to date
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:
- Coğrafi veriler atlanıyor
- Dizinlerin şifrelenmesi
- Veri birleştirmeler ile atlanıyor (yalnızca Spark 3 için)
- Bu özellikleri gösteren örnekler
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
öğesinincity
kolonunda0.1
yanlış 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.
- Toplanan tüm dizinlere ilişkin tipleri, parametreleri ve kolon adlarını gösteren meta veri nesnesinin şeması. Örneğin, bir
- Nesne adı sütunu, dizinlenen tüm nesnelerin adlarını saklar.
- Diğer şeylerin yanı sıra, kendisi bir Parke dosyası olan meta veri nesnesinin altbilgi sütunu şunları içerir:
- 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.
Dizin şifrelemesini kullanmak için:
PME ' nin etkinleştirildiğinden emin olmak için tüm adımları izleyin. Bkz. PME.
Anahtar Yönetimi yapılandırmaları da içinde olmak üzere tüm olağan PME yapılandırmalarını gerçekleştirin.
Bir veri kümesi için şifrelenmiş meta veri yarat:
- Meta veri yaratmak için olağan akışı izleyin.
- 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ğerinitrue
olarak ayarlayın (Aşağıdaki örneklere bakın). IndexBuilder
iç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 temp
iç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 city
oluş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.