La omisión de datos puede aumentar significativamente el rendimiento de las consultas SQL omitiendo los datos irrelevantes basándose en los metadatos de resumen asociados con cada objeto.
La omisión de datos utiliza la biblioteca Xskipper de código abierto para crear, gestionar y desplegar índices de omisión con Apache Spark. Consulte Xskipper - Una infraestructura de omisión de datos extensible.
Para obtener más detalles sobre cómo trabajar con Xskipper, consulte:
Además de las funciones de código abierto de Xskipper, también están disponibles las siguientes características:
- Omisión de datos geoespaciales
- Cifrado de índices
- Omisión de datos con uniones (solo para Spark 3)
- Ejemplos que muestran estas características
Omisión de datos geoespaciales
También puede utilizar la omisión de datos al consultar conjuntos de datos geoespaciales utilizando funciones geoespaciales desde la biblioteca spatio-temporal.
- Para aprovechar la omisión de datos en conjuntos de datos con columnas de latitud y longitud, puede recopilar los índices mín/máx en las columnas de latitud y longitud.
- La omisión de datos se pueden utilizar en conjuntos de datos con una columna de geometría (una columna UDT) utilizando un plug-in Xskipper incorporado.
En las siguientes secciones se muestra cómo trabajar con el plugin geoespacial.
Configuración del plugin geoespacial
Para utilizar el plugin, cargue las implementaciones relevantes utilizando el módulo Registro. Tenga en cuenta que sólo puede utilizar Scala en aplicaciones en IBM Analytics Engine powered by Apache Spark, no en watsonx.ai Studio.
Para 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)
Para 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')
Creación de índices
Para crear un índice, puede utilizar la API addCustomIndex
. Tenga en cuenta que sólo puede utilizar Scala en aplicaciones en IBM Analytics Engine powered by Apache Spark, no en watsonx.ai Studio.
Para 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)
Para 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)
Funciones admitidas
La lista de funciones geoespaciales admitidas incluye las siguientes:
- ST_Distance
- ST_Intersects
- ST_Contains
- ST_Equals
- ST_Crosses
- ST_Touches
- ST_Within
- ST_Overlaps
- ST_EnvelopesIntersect
- ST_IntersectsInterior
Cifrado de índices
Si utiliza un almacén de metadatos de Parquet, los metadatos se pueden cifrar mediante el cifrado modular de Parquet (PME). Esto se consigue almacenando los propios metadatos como un conjunto de datos Parquet, y por lo tanto, se puede utilizar PME para cifrarlos. Esta característica se aplica a todos los formatos de entrada, por ejemplo, se pueden cifrar los metadatos de un conjunto de datos almacenado en formato CSV mediante PME.
En la sección siguiente, a menos que se especifique lo contrario, cuando se hace referencia a pies de página, columnas, etc., son con respecto a los objetos de metadatos, no a los objetos del conjunto de datos indexado.
El cifrado de índice es modular y granular de la siguiente manera:
- Cada índice puede estar cifrado (con una granularidad de clave por índice) o dejarse en texto sin formato
- Columna d pie de página + nombre de objeto:
- Columna de pie de página del objeto de metadatos que es en sí un archivo Parquet que contiene, entre otras cosas:
- Esquema del objeto de metadatos, que revela los tipos, parámetros y nombres de columna de todos los índices recopilados. Por ejemplo, puede descubrir que un
BloomFilter
está definido en la columnacity
con una probabilidad de falso positivo de0.1
. - Vía de acceso completa al conjunto de datos original o a un nombre de tabla en caso de una tabla de metastore Hive.
- Esquema del objeto de metadatos, que revela los tipos, parámetros y nombres de columna de todos los índices recopilados. Por ejemplo, puede descubrir que un
- La columna de nombre de objeto almacena los nombres de todos los objetos indexados.
- Columna de pie de página del objeto de metadatos que es en sí un archivo Parquet que contiene, entre otras cosas:
- La columna de pie de página + metadatos puede ser:
Ambos cifrados utilizando la misma clave. Esta es la opción predeterminada. En este caso, la configuración de pie de página de texto sin formato para los objetos de Parquet que contiene los metadatos está en modalidad de pie de página cifrada y la columna de nombre de objeto se cifra utilizando la clave seleccionada.
Ambos en texto sin formato. En este caso, los objetos de Parquet que contienen los metadatos están en modalidad de pie de página de texto sin formato y la columna de nombre de objeto no está cifrada.
Si al menos un índice está marcado como cifrado, se debe configurar una clave de pie de página independientemente de si la modalidad de pie de página de texto sin formato está habilitada o no. Si se establece el pie de página de texto sin formato, la clave de pie de página solo se utiliza para comprobar si se han producido manipulaciones indebidas. Tenga en cuenta que en este caso la columna de nombre de objeto no está a prueba de manipulaciones.
Si se configura una clave de pie de página, se debe cifrar al menos un índice.
Antes de utilizar el cifrado de índice, debe consultar la documentación en PME y asegurarse de que está familiarizado con los conceptos.
key
en cualquier API Xskipper, siempre es la etiqueta ` NUNCA la propia clave `.Para utilizar el cifrado de índice:
Siga todos los pasos para asegurarse de que PME esté habilitado. Consulte PME.
Realice todas las configuraciones habituales de PME, incluidas las configuraciones de gestión de claves.
Crear metadatos cifrados para un conjunto de datos:
- Siga el flujo habitual para crear metadatos.
- Configure una clave de pie de página. Si desea establecer una columna de nombre de objeto + pie de página de texto sin formato, establezca
io.xskipper.parquet.encryption.plaintext.footer
entrue
(consulte los ejemplos siguientes). - En
IndexBuilder
, para cada índice que desee cifrar, añada la etiqueta de la clave que se utilizará para ese índice.
Para utilizar metadatos durante el tiempo de consulta o para renovar los metadatos existentes, no es necesaria ninguna configuración aparte de la configuración de PME regular necesaria para asegurarse de que las claves son accesibles (literalmente, la misma configuración necesaria para leer un conjunto de datos cifrados).
Ejemplos
En los ejemplos siguientes se muestra cómo crear metadatos utilizando una clave denominada k1
como una clave de pie de página + nombre de objeto, y una clave denominada k2
como clave para cifrar un MinMax
para temp
, al mismo tiempo que se crea una ValueList
para city
, que se deja en texto sin formato. Tenga en cuenta que sólo puede utilizar Scala en aplicaciones en IBM Analytics Engine powered by Apache Spark, no en watsonx.ai Studio.
Para 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)
Para 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)
Si desea que el pie de página + nombre de objeto se dejen en modalidad de texto sin formato (como se ha mencionado anteriormente), debe añadir el parámetro de configuración:
Para 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)
Para 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)
Omisión de datos con uniones (solo para Spark 3)
Con Spark 3, puede utilizar la omisión de datos en las consultas de unión como:
SELECT *
FROM orders, lineitem
WHERE l_orderkey = o_orderkey and o_custkey = 800
Este ejemplo muestra un esquema en estrella basado en el esquema de referencia TPC-H (consulte TPC-H) donde lineitem es una tabla de hechos y contiene muchos registros, mientras que la tabla orders es una tabla de dimensiones que tiene un número relativamente pequeño de registros en comparación con las tablas de hechos.
La consulta anterior tiene un predicado en las tablas de pedidos que contiene un pequeño número de registros, lo que significa que el uso de mín/máx no se beneficiará demasiado de la omisión de datos.
La omisión dinámica de datos es una característica que permite que consultas como la anterior se beneficien de la omisión de datos extrayendo primero los valores de l_orderkey
relevantes en función de la condición de la tabla orders
y luego utilizándola para reducir un predicado en l_orderkey
que utiliza índices de omisión de datos para filtrar los objetos irrelevantes.
Para utilizar esta característica, habilite la siguiente regla de optimización. Tenga en cuenta que sólo puede utilizar Scala en aplicaciones en IBM Analytics Engine powered by Apache Spark, no en watsonx.ai Studio.
Para Scala:
import com.ibm.spark.implicits. spark.enableDynamicDataSkipping()
Para Python:
from sparkextensions import SparkExtensions SparkExtensions.enableDynamicDataSkipping(spark)
Luego utilice la API Xskipper como de costumbre y sus consultas se beneficiarán de la omisión de datos.
Por ejemplo, en la consulta anterior, la indexación de l_orderkey
utilizando min/max habilitará la omisión sobre la tabla lineitem
y mejorará el rendimiento de la consulta.
Soporte para metadatos más antiguos
Xskipper da soporte a los metadatos antiguos creados por MetaIndexManager. Los metadatos más antiguos se pueden utilizar para la omisión, ya que las actualizaciones de los metadatos de Xskipper se llevan a cabo automáticamente mediante la siguiente operación de renovación.
Si ve DEPRECATED_SUPPORTED
delante de un índice al listar índices o al ejecutar una operación de describeIndex
, significa que la versión de metadatos está en desuso, pero todavía recibe soporte y la omisión funcionará. La siguiente operación de renovación actualizará automáticamente los metadatos.
Tema padre: Cuadernos y scripts