Lea nuestro artículo sobre

class="lazyload

.

En su actividad diaria, los ingenieros de Data y los analistas de Data deben mejorar los procesos de ingestión de data . Más allá de las pruebas unitarias habituales, puede ser interesante comparar fácil y rápidamente dos conjuntos de datos (es decir, tablas, vistas, consultas, etc.) con distintos fines, como el análisis de impacto o las pruebas de no regresión. Asimismo, la identificación de discrepancias entre dos puntos de vista de una tabla instantánea es bastante útil para el análisis ad hoc o la depuración.

Teniendo esto en cuenta y para los profesionales de SQL, un script preconstruido y reutilizable tiene sentido, de ahí el propósito de este artículo.

Explicación de la plantilla SQL lista para usar

Vayamos al meollo de la cuestión con la pregunta esperada:

Ahora, vamos a explicarlo:

  • En primer lugar, utilizamos CTE - Common Table Expressions (WITH ... ASstatements) para identificar los dos conjuntos de datos que se van a comparar. De este modo, las siguientes líneas de consulta pueden permanecer inalteradas.

  • A continuación, construimos dos consultas similares con los alias dataset_1_only y dataset_2_only para conservar las filas que sólo están presentes en el conjunto de datos 1 (en comparación con el conjunto de datos 2) y viceversa gracias al operador EXCEPT set.

  • Por último, se define un campo complementario flag para identificar el origen de las filas no coincidentes de ambas consultas. A continuación, se reúnen mediante el operador de conjunto UNION ALL.

Nota: obviamente, disponer de dos conjuntos de datos con campos comparables es un requisito previo para utilizar la consulta anterior

Ejemplo ilustrado

Basta de teoría, ¡ahora a la práctica! Supongamos que un supermercado desea recuperar en una sola tabla todos los productos que pueden acogerse a una promoción según las condiciones de promoción de la semana.

Como declaración inicial, consideramos que los siguientes productos están en stock:

Según las condiciones de promoción de la semana 1:

  • 10% de descuento en estantes de frutas, verduras y hierbas aromáticas

el conjunto de datos_1 es:

En la semana 2, las condiciones de promoción evolucionan a:

  • 10% de descuento en los estantes de frutas y helados

  • 20% de descuento en verduras

  • sin descuento en el estante de hierbas

La evolución de la tubería data genera el conjunto de datos_2:

Pero... ¿estamos realmente seguros de los resultados? Las preguntas típicas son:

  • ¿Faltan filas o sobran filas?

  • ¿son correctas las evoluciones aplicadas en los campos afectados?

  • ¿hay alguna regresión en los campos no afectados?

Nota: aunque parezca fácil responder a las preguntas anteriores de forma intuitiva debido a un ejemplo trivial sobre un pequeño conjunto de datos, en casos de uso real solemos enfrentarnos a multitud de filas y columnas procedentes de consultas complejas (transformaciones, uniones, agregados, funciones de ventana, ...) dejando que esta consulta adquiera todo su significado

Intentemos responder a las 3 preguntas interpretando los resultados de la consulta comparativa:

Observaciones:

  • Ninguna fila con productos del lineal de frutas: bien, ya que el "10% de descuento en frutas" no ha cambiado de la semana 1 a la 2.

  • Product_ID #50 (estante de hierbas) falta en el conjunto de datos_2 (sólo en el conjunto de datos_1): bien ya que el "descuento en hierbas" se detuvo en la semana 2

  • Product_ID #60 (estantería de helados) falta en el conjunto de datos_1 (sólo en el conjunto de datos_2): bien, ya que el "descuento en helados" se introdujo en la semana 2.

  • Las filas relativas a Product_ID #30 y #40 (estantería de verduras) son divergentes en el campo reduced_price: bien ya que el "descuento en verduras" aumentó del 10% en la semana 1 al 20% en la semana 2

Por fin, todo tiene buena pinta:

  • ¿Faltan filas o sobran filas? No.

  • ¿son correctas las evoluciones aplicadas en los campos afectados? Sí.

  • ¿hay regresión en los campos no afectados? No.

Trucos y consejos

En CTE, incluso si puede copiar y pegar su consulta SQL de ingestión antes/después de la evolución, podría ser una buena idea almacenar los resultados en tablas temporales para simplificar la comparación, mejorar el rendimiento de la consulta y beneficiarse del almacenamiento en caché si la ejecuta varias veces.

En el mundo real, las divergencias entre dos conjuntos de datos pueden ser confusas. Entonces, ordenar los resultados por clave (la granularidad de los conjuntos de datos) y por bandera puede ayudar enormemente a interpretar y comparar filas equivalentes procedentes de ambos conjuntos de datos.

Para facilitar las investigaciones e identificar el origen de las diferencias, los campos comunes de los conjuntos de datos sospechosos pueden eliminarse (es decir, comentarse en CTE) de la comparación: si no hay resultado, significa que todos los campos comparados son iguales. A continuación, puede centrarse únicamente en los campos sospechosos restantes para la siguiente comparación y realizarla paso a paso.

Nota: se podría haber realizado un análisis equivalente utilizando la estrategia LEFT JOIN, pero habría sido mucho más difícil de mantener (gestión de NULLs y comparación de campos) y menos eficiente, ya que los operadores de conjuntos son más potentes que las uniones.

Resumen

Por tanto, esta consulta planificada facilita a los desarrolladores la rápida validación de cambios en canalizaciones complejas de data . Es útil como complemento de pruebas unitarias más tradicionales, e incluso puede considerarse de forma más general al comparar dos conjuntos de datos con estructuras similares. Por último, la lógica de esta consulta es fácil de aprender de memoria.

Gracias por leer, espero que haya quedado claro y me encantaría conocer su opinión :)

class="lazyload

Blog de Medium por Artefact.

Este artículo fue publicado inicialmente en Medium.com.
¡Síganos en nuestro blog de Medium!