0 / 0
Volver a la versión inglesa de la documentación
Omisión de datos para SQL de Spark
Última actualización: 21 nov 2024
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 - 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

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 columna city con una probabilidad de falso positivo de 0.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.
    • La columna de nombre de objeto almacena los nombres de todos los objetos indexados.
  • 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.

Importante: Cuando se utiliza el cifrado de índice, siempre que se configura un key en cualquier API Xskipper, siempre es la etiqueta ` NUNCA la propia clave `.

Para utilizar el cifrado de índice:

  1. Siga todos los pasos para asegurarse de que PME esté habilitado. Consulte PME.

  2. Realice todas las configuraciones habituales de PME, incluidas las configuraciones de gestión de claves.

  3. Crear metadatos cifrados para un conjunto de datos:

    1. Siga el flujo habitual para crear metadatos.
    2. 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 en true (consulte los ejemplos siguientes).
    3. 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. 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

Búsqueda y respuesta de IA generativa
Estas respuestas las genera un modelo de lenguaje grande en watsonx.ai que se basa en el contenido de la documentación del producto. Más información