Compartir vía


Trabajo con combinaciones en Azure Databricks

Databricks admite la sintaxis de combinación estándar ANSI. En esta página se describen las diferencias entre las combinaciones con el procesamiento por lotes y el procesamiento de flujos.

Nota:

Databricks también admite la sintaxis estándar para los operadores de conjunto UNION, INTERSECT y EXCEPT. Consulte Operadores de conjunto.

Diferencias entre uniones en streaming y por lotes

Las combinaciones en Azure Databricks son con estado o sin estado.

Todas las combinaciones por lotes son combinaciones sin estado. Los resultados son procesados inmediatamente y reflejan los datos al momento de ejecutar la consulta. Cada vez que se ejecuta la consulta, los nuevos resultados se calculan en función de los datos de origen especificados. Consulte Combinaciones por lotes.

Las uniones entre dos fuentes de datos de transmisión son con estado. En combinaciones con estado, Azure Databricks realiza un seguimiento de la información sobre los orígenes de datos y los resultados y actualiza los resultados de forma iterativa. Las combinaciones con estado pueden proporcionar soluciones eficaces para el procesamiento de datos en línea, pero pueden ser difíciles de implementar de forma eficaz. Tienen semántica operacional compleja en función del modo de salida, el intervalo de activación y la marca de agua. Consulte Combinaciones de flujo a flujo.

Las combinaciones estáticas de flujo no tienen estado, pero proporcionan una buena opción para combinar un origen de datos incremental (como una tabla de hechos) con un origen de datos estático (por ejemplo, una tabla dimensional que cambia lentamente). En lugar de combinar todos los registros de ambos lados cada vez que se ejecuta una consulta, solo se combinan los registros recién recibidos del origen de streaming con la versión actual de la tabla estática. Consulte Combinaciones estáticas de flujos.

Combinaciones por lotes

Azure Databricks admite la sintaxis de combinación SQL estándar, incluidas las combinaciones internas, externas, semi, anti y cruzadas. Consulte JOIN.

Nota:

Databricks recomienda usar una vista materializada para optimizar el cálculo incremental de los resultados de una combinación interna. Consulte Vistas materializadas.

Uniones de flujo-flujo

La combinación de dos orígenes de datos de streaming puede presentar desafíos importantes en la administración de la información de estado y el razonamiento sobre el cálculo y la salida de los resultados. Antes de implementar una combinación de flujo a flujo, Databricks recomienda desarrollar una comprensión sólida de las semánticas operativas para la transmisión con estado, incluyendo cómo las marcas de agua afectan a la administración del estado. Consulte las páginas siguientes:

Databricks recomienda especificar marcas de agua en ambos lados de todas las uniones de flujos de transmisión. Se admiten los siguientes tipos de combinación:

  • Combinaciones internas
  • Combinaciones externas izquierdas
  • Combinaciones externas derechas
  • Combinaciones externas completas
  • Semicombinaciones izquierdas

Consulte la documentación de Apache Spark Structured Streaming sobre las combinaciones de secuencias de transmisión.

Combinaciones estáticas de secuencias

Nota:

El comportamiento descrito para las combinaciones estáticas de flujo supone que los datos estáticos se almacenan mediante Delta Lake.

Una combinación de secuencia estática combina la versión válida más reciente de una tabla Delta (los datos estáticos) a una secuencia de datos mediante una combinación sin estado.

Cuando Azure Databricks procesa un micro-lote de datos en una unión de flujo-estática, la versión válida más reciente de los datos de la tabla Delta estática se une con los registros presentes en el micro-lote actual. Dado que la combinación no tiene estado, no es necesario configurar el sellado de tiempo y los resultados se pueden procesar con baja latencia. Los datos de la tabla delta estática usada en la combinación deben cambiar lentamente.

Nota:

Si actualiza la tabla estática entre ejecuciones, volver a procesar los mismos datos de streaming puede generar resultados diferentes. La salida de una combinación entre flujo y estático no es determinista si el lado estático de la combinación está cambiando, porque cada micro-lote se une con la versión más reciente de la tabla estática en el momento del procesamiento.

En el siguiente ejemplo se muestra este patrón:

streamingDF = spark.readStream.table("orders")
staticDF = spark.read.table("customers")

query = (streamingDF
  .join(staticDF, streamingDF.customer_id==staticDF.id, "inner")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .table("orders_with_customer_info")
)

Sugerencias de unión en Azure Databricks

Apache Spark permite especificar pistas de unión para uniones de rango y uniones sesgadas. Las sugerencias para las combinaciones sesgadas no son necesarias porque Azure Databricks optimiza automáticamente estas combinaciones. Consulte Sugerencias.

Las sugerencias para las combinaciones de rango pueden ser útiles si el rendimiento de las combinaciones es bajo y está realizando combinaciones de desigualdad. Ejemplos incluyen unir basándose en rangos de marcas de tiempo o en un rango de IDs de agrupamiento. Consulte Optimización de uniones por rango y Optimizar el rendimiento de unión en Azure Databricks.