0 / 0
Go back to the English version of the documentation
Pomijanie danych dla Spark SQL
Last updated: 29 wrz 2023
Pomijanie danych dla Spark SQL

Pomijanie danych może znacząco zwiększyć wydajność zapytań SQL, pomijając nieistotne obiekty danych lub pliki w oparciu o metadane podsumowujące powiązane z każdym obiektem.

Pomijanie danych korzysta z biblioteki Open Source Xskipper do tworzenia, zarządzania i wdrażania indeksów pomijania danych za pomocą programu Apache Spark. Patrz Xskipper-An Extensible Data Skipping Framework.

Więcej szczegółów na temat pracy z produktem Xskipper można znaleźć w:

Oprócz funkcji open source w Xskipper, dostępne są również następujące funkcje:

Pomijanie danych geoprzestrzennych

Można również korzystać z pomijania danych podczas odpytywania zestawów danych geoprzestrzennych za pomocą funkcji geoprzestrzennych z biblioteki przestrzenno-czasowej.

  • Aby korzystać z danych pominiętych w zestawach danych z kolumnami szerokości i szerokości geograficznej, można zgromadzić indeksy min/max w kolumnach szerokości i szerokości geograficznej.
  • Pomijanie danych może być używane w zestawach danych z kolumną geometrii (kolumna UDT) przy użyciu wbudowanej wtyczki Xskipper.

Kolejne sekcje pokazują, że można pracować z wtyczką geoprzestrzenną.

Konfigurowanie wtyczki geoprzestrzennej

Aby korzystać z wtyczki, należy załadować odpowiednie implementacje za pomocą modułu Rejestracja. Należy pamiętać, że w aplikacjach IBM Analytics Engine opartych na technologii Apache Sparkmożna używać tylko aplikacji Scala, a nie w programie Watson Studio.

  • Dla skaly:

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

Budowanie indeksu

Aby zbudować indeks, można użyć interfejsu API produktu addCustomIndex . Należy pamiętać, że w aplikacjach IBM Analytics Engine opartych na technologii Apache Sparkmożna używać tylko aplikacji Scala, a nie w programie Watson Studio.

  • Dla skaly:

    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)
    
  • Dla 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)
    

Obsługiwane funkcje

Lista obsługiwanych funkcji geoprzestrzennych obejmuje następujące elementy:

  • ST_Distance
  • ST_Intersects
  • ST_Zawiera
  • ST_Equals
  • ST_Crosses
  • Elementy typu ST_Touches
  • DST_w
  • ST_Overlaps
  • ST_EnvelopesIntersect
  • ST_IntersectsInterior

Szyfrowanie indeksów

W przypadku użycia składnicy metadanych Parkiet metadane mogą być opcjonalnie szyfrowane przy użyciu programu Parquet Modular Encryption (PME). Cel ten jest osiągany przez przechowywanie metadanych jako zestawu danych Parkietu, a tym samym PME może być używany do szyfrowania. Ta funkcja ma zastosowanie do wszystkich formatów wejściowych, na przykład zestaw danych zapisany w formacie CSV może mieć metadane zaszyfrowane przy użyciu PME.

W poniższej sekcji, o ile nie określono inaczej, w odniesieniu do stopek, kolumn i tak dalej, są to obiekty metadanych, a nie obiekty w indeksowanym zestawie danych.

Szyfrowanie indeksu jest modułowe i granulowane w następujący sposób:

  • Każdy indeks może być zaszyfrowany (z granulacją klucza indeksu) lub pozostawiony w zwykłym tekście.
  • Stopka + kolumna nazwy obiektu:
    • Kolumna stopki obiektu metadanych, który sam w sobie jest plikiem Parkietu, zawiera między innymi:
      • Schemat obiektu metadanych, który ujawnia typy, parametry i nazwy kolumn dla wszystkich zgromadzonych indeksów. Na przykład można się dowiedzieć, że BloomFilter jest zdefiniowany w kolumnie city z fałszywie dodatnim prawdopodobieństwem 0.1.
      • Pełna ścieżka do oryginalnego zestawu danych lub nazwa tabeli w przypadku tabeli metastore Hive .
    • W kolumnie Nazwa obiektu przechowywane są nazwy wszystkich indeksowanych obiektów.
  • Stopka + kolumna metadanych może być:
    • Oba zaszyfrowane przy użyciu tego samego klucza. Jest to ustawienie domyślne. W tym przypadku konfiguracja stopki w postaci zwykłego tekstu dla obiektów Parkietu składająca się z metadanych w trybie zaszyfrowanego stopki, a kolumna nazwy obiektu jest szyfrowana za pomocą wybranego klucza.

    • Zarówno w zwykłym tekście. W tym przypadku obiekty Parkiet zawierające metadane są w trybie stopka zwykłego tekstu, a kolumna nazwy obiektu nie jest zaszyfrowana.

      Jeśli co najmniej jeden indeks jest oznaczony jako zaszyfrowany, wówczas klucz stopki musi być skonfigurowany niezależnie od tego, czy włączony jest tryb stopki zwykłego tekstu. Jeśli stopka tekstu zwykłego jest ustawiona, klucz stopki jest używany tylko do zabezpieczania przed manipulowaniem. Należy zauważyć, że w tym przypadku kolumna nazwy obiektu nie jest zabezpieczona przed manipulacją.

      Jeśli klucz stopki jest skonfigurowany, to co najmniej jeden indeks musi być zaszyfrowany.

Przed użyciem szyfrowania indeksów należy sprawdzić dokumentację na stronie PME i upewnić się, że są znane pojęcia.

Ważne: Gdy używane jest szyfrowanie indeksu, zawsze gdy w dowolnym interfejsie API Xskipper jest skonfigurowany klucz ` key `, zawsze jest to etykieta ` NIGDY sam klucz `.

Aby użyć szyfrowania indeksu:

  1. Wykonaj wszystkie kroki, aby upewnić się, że PME jest włączone. Patrz PME.

  2. Wykonaj wszystkie zwykłe konfiguracje PME, w tym konfiguracje zarządzania kluczami.

  3. Utwórz zaszyfrowane metadane dla zestawu danych:

    1. Postępuj zgodnie z regularnym przepływem przy tworzeniu metadanych.
    2. Skonfiguruj klucz stopki. Jeśli chcesz ustawić kolumnę nazwy obiektu w postaci zwykłego tekstu, ustaw wartość io.xskipper.parquet.encryption.plaintext.footer na true (Patrz przykłady poniżej).
    3. W programie IndexBuilderdla każdego indeksu, który ma być szyfrowany, należy dodać etykietę klucza, który ma być używany dla tego indeksu.

    W celu użycia metadanych w czasie wykonywania zapytań lub w celu odświeżenia istniejących metadanych nie jest konieczna żadna konfiguracja inna niż zwykła konfiguracja PME, aby upewnić się, że klucze są dostępne (dosłownie taka sama konfiguracja wymagana do odczytania szyfrowanego zestawu danych).

Przykłady

Następujące przykłady przedstawiają tworzenie metadanych przy użyciu klucza o nazwie k1 jako klucza nazwy obiektu w stopce + oraz klucz o nazwie k2 jako klucz do szyfrowania MinMax dla temp, a jednocześnie tworzony jest ValueList dla city, który jest pozostawiony w postaci jawnego tekstu. Należy pamiętać, że w aplikacjach IBM Analytics Engine opartych na technologii Apache Sparkmożna używać tylko aplikacji Scala, a nie w programie Watson Studio.

  • Dla skaly:

    // 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)
    
  • Dla 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)
    

Jeśli chcesz, aby stopka + nazwa obiektu została pozostawiona w trybie zwykłego tekstu (jak wspomniano powyżej), musisz dodać parametr konfiguracyjny:

  • Dla skaly:

    // 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)
    
  • Dla 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)
    

Pomijanie danych za pomocą łączeń (tylko dla Spark 3)

W przypadku środowiska Spark 3 można korzystać z pomijania danych w zapytaniach łączonych, takich jak:

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

W tym przykładzie przedstawiono schemat gwiaździsty oparty na schemacie testu porównawczego TPC-H (patrz TPC-H), w którym pozycja wiersza jest tabelą faktów i zawiera wiele rekordów, natomiast tabela zamówień jest tabelą wymiarów, która zawiera stosunkowo niewielką liczbę rekordów w porównaniu z tabelami faktów.

Powyższe zapytanie ma predykat w tabelach zamówień, który zawiera małą liczbę rekordów, co oznacza, że korzystanie z funkcji min/max nie będzie korzystne dla danych pominiętych.

Dynamiczne pomijanie danych to funkcja, która umożliwia wykonywanie zapytań, takich jak powyższe, do korzystania z pomijania danych przez pierwsze wyodrębnienie odpowiednich wartości produktu l_orderkey w oparciu o warunek w tabeli orders , a następnie użycie go w celu wyłączenia predykatu w systemie l_orderkey , który korzysta z indeksów pomijania danych w celu filtrowania nieistotnych obiektów.

Aby użyć tej opcji, należy włączyć następującą regułę optymalizacji. Należy pamiętać, że w aplikacjach IBM Analytics Engine opartych na technologii Apache Sparkmożna używać tylko aplikacji Scala, a nie w programie Watson Studio.

  • Dla skaly:

      import com.ibm.spark.implicits.
    
      spark.enableDynamicDataSkipping()
    
  • Dla Python:

        from sparkextensions import SparkExtensions
    
        SparkExtensions.enableDynamicDataSkipping(spark)
    

Następnie należy użyć interfejsu API Xskipper jak zwykle, a zapytania skorzystają z pominięć danych.

Na przykład w powyższym zapytaniu indeksowanie l_orderkey przy użyciu min/max umożliwi pominięcie tabeli lineitem i poprawi wydajność zapytań.

Obsługa starszych metadanych

Xskipper obsługuje starsze metadane utworzone przez menedżera MetaIndexw sposób bezproblemowy. Starsze metadane mogą być używane do pomijania, ponieważ aktualizacje metadanych Xskipper są wykonywane automatycznie przez następną operację odświeżania.

Jeśli podczas wyświetlania indeksów lub uruchamiania operacji describeIndex zostanie wyświetlony komunikat DEPRECATED_SUPPORTED przed indeksem, wersja metadanych jest nieaktualna, ale nadal jest obsługiwana, a pomijanie będzie działać. Następna operacja odświeżania spowoduje automatyczną aktualizację metadanych.

Temat nadrzędny: Notebooki i skrypty

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