¡Hoy vengo con las pilas cargadas después de ver que el blog
ha tenido más de 3000 visitas! ¡Muchas gracias a tod@s!
Seguimos con la serie de SSIS, esta vez vamos a ver cómo
hacer una carga de dimensiones de variación lenta o (SCD: Slowly Changing Dimensions) de manera que
no perdamos la traza de la carga de datos en nuestro DWH. Os estaréis
preguntado… ¿pero realmente es necesario todo esto si con Power Query puedo hacer un millón de cosas? Mi respuesta es sí, que no está demás conocer este prisma de ETL
y os voy a decir el por qué, cuando estamos trabajando con Power Query, las
buenas prácticas dicen que debemos mantener el Query Folding o el plegado de consultas
lo máximo posible de cara a que toda o la mayor parte de la carga en el proceso
de transformación se haga en origen y no en destino. A modo ilustrativo:
Nota: El
plegado de consultas es la
capacidad de una consulta de Power Query para generar una única instrucción de
consulta para recuperar y transformar los datos de origen. El motor de mashup
de Power Query se esfuerza por lograr el plegado de consultas siempre que sea
posible por motivos de eficiencia.
Antes de empezar, vamos a comentar que los cambios
soportados por SSIS son 3, y son:
Tipo 0: No hay cambios.
Tipo 1: Sobrescribe el valor. ¿Qué significa? Veámoslo con
un ejemplo:
En la imagen superior, en la tabla de dimensión de la
izquierda (Origen) el atributo para el producto A es Coche, mientras que, en la
tabla de Destino, el atributo es Bici. Esto es que, en algún momento, este se
ha modificado, pero no se ha guardado registro del cambio y se sobrescribe
directamente el valor.
Tipo 2: Se añade un nuevo registro y se mantiene el
histórico.
En este caso, se realiza una modificación en la tabla de
dimensión, pero se quiere mantener el histórico. Como se puede ver, el cambio
de la categoría en la tabla de dimensión da como resultado una nueva tabla en
la cual se lleva el registro de las modificaciones mediante las columnas de
FechaInicio y FechaFin en las que los atributos están activos y cuando no.
De primeras, vamos a ver cómo hacerlo de manera automática,
con componente de “Dimensión de variación lenta” que por defecto traer Visual
Studio, pero no es la opción óptima que veremos en otro momento.
Vamos a Visual Studio y creamos un nuevo paquete SSIS:
necesitamos cargar la dimensión al modelo, para ello
arrastramos el componente “Tarea Flujo de Datos” al diseñador y le conectamos
el componente de la tarea anterior.
Entramos dentro del componente de flujo de datos, y le
tenemos que indicar el origen de los datos, para ello arrastramos al diseñador
de flujo de datos el componente “Origen de OLE DB” y lo configuramos de la
siguiente manera:
Y como sentencia SQL escribimos lo siguiente y pulsamos
sobre el botón Preview para visualizar los datos de nuestra sentencia:
Una vez que vemos que nuestra sentencia SQL es correcta y
nos devuelve los dato que necestiamos (menos mal ¿eh? J ) vamos a la pestaña de
Columns para revisar que todas las columnas están marcadas con el check y
pulsamos en Aceptar y cambiamos el nombre del componente (que no se nos
olvide).
Ahora arrastramos al diseñador de flujo el componente
“Dimensión de variación lenta” y lo conectamos con nuestro paso anterior.
Ahora,
le damos dos clicks para entrar en su configuración y Visual Studio nos abre
una ventana con Wizard:
Le damos a Next y se nos despliega la siguiente ventana, en
la que debemos configurar la conexión y la tabla o vista que queremos tratar:
Y como podemos ver, en la parte inferior se nos muestra los
campos de la tabla que queremos tratar, es decir, realizamos el mapeo de los
campos de origen con los campos de destino. En este paso, no es necesario
seleccionar todos los campos. Lo único que tenemos que definir es la clave
identificadora del negocio para esta tabla, que en este caso es “ProductSubCategoryKey”
y la marcamos como Business Key:
Una vez seleccionada la Business Key para la tabla, pulsamos
en Next y se nos abre la siguiente ventana:
En ella, seleccionamos dentro de las columnas que tenemos,
las columnas con que queremos trabajar y qué tipo de cambio va a tener esa
columna, es decir, tipo 0, tipo 1 o tipo 2. Para ello, cargamos todas las
columnas y vamos seleccionando el tipo de cambio:
Como hemos configurado, para la descripción de la categoría
hemos seleccionado atributo cambiante (tipo 1), para el título y SubCategoryKey
hemos seleccionado atributo fijo (tipo 0) y para el nombre hemos seleccionado
atributo histórico (tipo 2).
Nota: esto es a modo de ejemplo, una aplicación práctica de
atributo histórico puede ser el histórico de precios de un artículo.
Pulsamos en Next y se nos abre la venta en la que podemos
seleccionar que hacer con los atributos fijos y cambiantes,
Desmarco la primera opción que nos indica que falle la
transformación si se detectan cambios en un atributo fijo.
Y marco la segunda opción para que cambie todos los
registros coincidentes, incluidos los registros obsoletos, cuando se detecten
cambios en un atributo cambiante. Es decir, si yo tengo más de una versión de
mi producto para aquellos que tengo definidos como cambiantes se aplicará sobre
todas las versiones.
Una vez marcados y/o desmarcados los checks, pulsamos en
Next y se vamos a la siguiente pantalla:
Para los atributos históricos, en esta pantalla que se nos
ha abierto podemos seleccionar dos opciones, en la primera podemos seleccionar
que columna queremos utilizar para definir la versión actual del registro o
bien usar fecha de inicio y fecha fin para identificar las fechas de validez y
expiración de las versiones.
Marcamos la segunda opción y seleccionamos las columnas que
queremos usar como Start Date y End Date:
Y le indicamos la varible StartTime, con esta configuración
le estamos indicando que cuando genere las nuevas versiones, coja estos campos
como el período de validez de esa versión. Luego, en nuestra tabla de hechos,
cuando carguemos los datos, tendremos que tener en cuenta para cargar los
hechos, que el lookup por el que voy a obtener la clave subrogada, sea la
business key sea igual y además la fecha del registro este entre el periodo del
Start date y End Date. ¿Y para qué os estaréis preguntado? Pues por ejemplo
para verificar que el producto que he vendido se corresponde con el producto
activo. Es una doble condición. ;) Pulsamos en Next:
Y deshabilitamos la opción de miembros inferidos (que ya
hablaré de ellos en otro escenario) y pulsamos en Next y llegamos a la pantalla
resumen. Le damos Finish:
Y después de unos pocos segundos… Visual Studio nos ha
generado el siguiente flujo:
Si analizamos lo que nos ha realizado SSIS de manera
automática, vamos observamos tres flujos distintos que son:
En rojo, la salida de los componentes que son históricos.
En amarillo los componentes que son nuevos
Y en verde las actualizaciones de los atributos variables.
Podría entrar a analizar cada componente, pero estaríamos
aquí hasta final de año y no es plan… ¿no creéis?
Por otro lado, vaya retórica que os he pegado hasta aquí, ahora
os voy a contar algo que no me gusta de esto. Lo siento, ha llegado mis 30
segundos de pataleta y me toca J.
Si hacemos doble click en el componente Insert Destination se nos abre la
siguiente ventana:
Y como podéis ver, no usa Fast Load…. Y si lo ponemos, nos
podemos encontrar con bloqueos en la base de datos y eso es otro cantar…
Ahora ya que he terminado mi pataleta J, ejecutamos una consulta
a la tabla de Contoso ProductSubCategory para ver la tabla:
Y vemos que nos devuelve 44 registros. Ahora vamos a SSIS y
ejecutamos el paquete que se nos ha creado:
Y como podemos ver se nos ha ejecutado correctamente y el
número total de filas insertadas son 44. ¡Eureka! Las mismas que en la tabla de
origen J.
Lo comprobamos en SSMS:
Como podemos ver, la nueva tabla creada tiene las dos
columnas de fechas hemos creado y la columna Inicio tiene la fecha de validez.
Vamos a modificar el campo ProductSubcategoruLabel de un producto en la tabla
origen para validar el paquete. Para ello, ejecutamos la siguiente sentencia:
Y ejecutamos de nuevo el paquete SSIS:
Y podemos observar que ahora que ha sido insertada una fila
por el lado del flujo “Salida de inserciones de atributos históricos”. Volvemos
a SSMS y ejecutamos la consulta a la tabla Dimension.ProductSubCategorySCD,
filtrando el ProductSubCategoryKey a 1:
Y nos devuelve 2 filas:
Una con la fecha de inicio y fin completada y la otra con
sólo la fecha de inicio completada, por lo que ya tenemos nuestro SCD de tipo 2
configurado y funcionando.
¡Nos vemos en los datos!