Translation not up to date
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
- Szyfrowanie indeksów
- Pomijanie danych z łączeniami (tylko dla Spark 3)
- Przykłady przedstawiające te 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 kolumniecity
z fałszywie dodatnim prawdopodobieństwem0.1
. - Pełna ścieżka do oryginalnego zestawu danych lub nazwa tabeli w przypadku tabeli metastore Hive .
- Schemat obiektu metadanych, który ujawnia typy, parametry i nazwy kolumn dla wszystkich zgromadzonych indeksów. Na przykład można się dowiedzieć, że
- W kolumnie Nazwa obiektu przechowywane są nazwy wszystkich indeksowanych obiektów.
- Kolumna stopki obiektu metadanych, który sam w sobie jest plikiem Parkietu, zawiera między innymi:
- 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.
Aby użyć szyfrowania indeksu:
Wykonaj wszystkie kroki, aby upewnić się, że PME jest włączone. Patrz PME.
Wykonaj wszystkie zwykłe konfiguracje PME, w tym konfiguracje zarządzania kluczami.
Utwórz zaszyfrowane metadane dla zestawu danych:
- Postępuj zgodnie z regularnym przepływem przy tworzeniu metadanych.
- Skonfiguruj klucz stopki. Jeśli chcesz ustawić kolumnę nazwy obiektu w postaci zwykłego tekstu, ustaw wartość
io.xskipper.parquet.encryption.plaintext.footer
natrue
(Patrz przykłady poniżej). - W programie
IndexBuilder
dla 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