Omisión de datos para SQL de Spark
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-An Extensible Data Skipping Framework.
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
También puede utilizar la omisión de datos al consultar conjuntos de datos geoespaciales utilizando funciones geoespaciales de la biblioteca espacio-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 puede utilizar en conjuntos de datos con una columna de geometría (una columna UDT) utilizando un plugin Xskipperincorporado.
En las siguientes secciones se muestra cómo trabajar con el plugin geoespacial.
Configuración del plugin geoespacial
Para utilizar un plugin, cargue las implementaciones relevantes mediante el módulo de registro:
-
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 de addCustomIndex:
-
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 puede ser 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
BloomFilterestá definido en la columnacitycon 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. Este es el valor predeterminado. 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.
Cuando se utiliza el cifrado de índice, siempre que se configura un key en cualquier API de Xskipper, es siempre la etiqueta NEVER the key itself.
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.footerentrue(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 k1como 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.
-
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)
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.