Cargando Tablas de Dimensión
La transformación y carga de una dimensión es acerca del rastreo
del actual y algunas veces histórico de atributos asociados en una tabla de dimensión.
La figura muestra las dimensiones relacionadas a la tabla Sales Quota Fact en
la base de datos AdventureWorksDW2014 (llamado FactSalesQuota). El objetivo es
procesar los datos de las tablas de origen en las tablas de dimensión.
En este ejemplo, observe que cada dimensión (DimEmployee,
DimSalesTerritory y DimDate) tiene una llave sustituta llamada Dimension Key, así también como una llave
candidata llamada Dimension AlternateKey.
La llave sustituta es el concepto más importante en el data warehousing, porque
habilita el rastreo del historial de cambios y optimiza las estructuras para el
rendimiento. Las llaves sustitutas son a menudo columnas identity auto incrementales
que son contenidas en la tabla de dimensión.
La ETL de dimensiones tiene varios objetivos, cada uno de
los cuales es revisado en los pasos de este post para cargar las tablas
DimSalesTerritory y DimEmployee, incluyendo los siguientes:
Ø
Identificar
las llaves de origen que identifican únicamente un registro de origen y que se asignarán
a la Alternate Key
Ø
Realizar
cualquier Transformación de Datos para alinear los datos de origen a las
estructuras de dimensión
Ø
Manejar
los diferentes tipos de cambios para cada columna de origen y agregar o
actualizar los registros de dimensión
SSIS incluye una transformación integrada llamada la Slowly
Changing Dimension (SCD) para asistir en el proceso. Esta no es la única
transformación que puede utilizar para cargar una tabla de dimensión, pero la utilizará
en estos pasos del post para lograr la carga de la dimensión.
Cargando una Tabla de Dimensión Simple
Muchas tablas de dimensión son como la dimensión Sales
Territory porque contienen sólo unas pocas columnas, y el rastreo del historial
no es necesario para alguno de los atributos. En este ejemplo, la tabla
DimSalesTerritory es originado de la tabla [Sales].[SalesTerritory], y
cualquier cambio del origen a cualquiera de las tres columnas será actualizada
en la tabla de dimensión. Estas columnas son referidas a cómo cambiar atributos de dimensión, porque
los valores pueden cambiar.
1.
Para
comenzar a crear el ETL para la tabla DimSalesTerritory, crear un nuevo proyecto
Integration Services, luego de cargarlo, renombre el paquete por defecto a ETL_DimSalesTerritory.dtsx.
2. Para
que sean extraídos los datos de la base de datos AdventureWorks2014 y se carguen
los datos en la base de datos AdventureWorksDW2014, crear dos conexiones de
proyecto OLE DB a estas bases de datos llamadas AdventureWorks2014 y AdventureWorksDW2014,
respectivamente.
3.
Arrastre
una nueva tarea Data Flow de la Toolbox SSIS en el Control Flow y navegue hasta
el diseñador Data Flow.
4.
Arrastre
un componente Origen de OLE DB en el Data Flow y haga doble clic en el nuevo
origen para abrir el editor. Configure la lista desplegable OLE DB Connection
Manager para utilizar la base de datos AdventureWorks2014 y dejar la selección Data Access Modes como "Table
or View". En la lista desplegable "Name of the Table or the View",
seleccione [Sales].[SalesTerritory], como es mostrada en la Figura.
5. En la página de propiedades Columns
(ver figura), cambie el valor Output Column para la columna TerritoryID a
SalesTerritoryAlternateKey, cambie la columna Name a SalesTerritoryRegion, y
cambie la Output Column para la columna Group a SalesTerritoryGroup. También,
desactive todas las columnas bajo SalesTerritoryGroup porque no son necesarios
para la tabla DimSalesTerritory.
6.
Haga
clic en OK para guardar los cambios y luego arrastre una transformación Lookup
en el Data Flow y conecte la ruta de datos azul desde el origen OLE DB sobre la
Lookup.
7. En la página de propiedades General, mostrada
en la figura, edite la transformación Lookup como sigue: deje el ajuste Cache
Mode en Full Cache, y deje el ajuste Connection Type a OLE DB Connection
Manager.
8. En la página de propiedades Connection,
establezca la lista desplegable OLE DB Connection Manager a la conexión
AdventureWorks. Cambie la lista desplegable "Use a Table or a View" a
[Person].[CountryRegion].
9. En la página de propiedades Columns,
arrastre la CountryRegionCode de la lista Available Input Columns a la columna
correspondiente en la lista Available Lookup Columns, luego, seleccione la
casilla de verificación al lado a la columna Name en la misma lista de columnas.
Renombre la columna Output Alias de la columna Name a SalesTerritoryCountry, como se muestra en la figura.
10. Seleccione OK en el Lookup
Transformation Editor para guardar los cambios. En este punto del proceso, ha
realizado algunos pasos iniciales simples para alinear los datos de origen con
la tabla de dimensión de destino. Los próximos pasos son el núcleo del
procesamiento de la dimensión y se utiliza la transformación SCD.
11. Arrastre una transformación Dimensión
de Variación Lenta de la Toolbox SSIS en el Data Flow y conecte la salida de la
ruta de datos azul de la Lookup a la transformación Dimensión de Variación Lenta.
Cuando suelta la ruta sobre la transformación SCD, se le pedirá que seleccione
la salida de Lookup. Seleccione Salida de Entradas Coincidentes de Búsqueda de
la lista desplegable y luego haga clic en OK.
12. Para invocar el asistente de SCD, haga
doble clic en la transformación, que abrirá una pantalla de bienvenida del
asistente. Proceder a la segunda pantalla, haga clic en Next.
13. La primera entrada del asistente
requiere identificar la tabla de dimensión a la que los datos de origen se
refieren. Por lo tanto, escoja AdventureWorksDW2014 como la Connection Manager
y luego elija [dbo].[DimSalesTerritory] como la Table or View, que mostrará
automáticamente las columnas de la tabla de dimensión en la lista, como es mostrada
en la figura. Para el SalesTerritoryAlternateKey, cambie el Key Type a Business
key. Dos propósitos son servidos aquí:
Ø
Uno,
se identifica la llave candidata (o business key) de la tabla de dimensión y
que columna de entrada coincide. Esto será utilizado para identificar las coincidencias
de la fila entre el origen y el destino.
Ø Dos, las columnas son enlazadas del origen
a los atributos en la tabla de dimensión, que será utilizada en la siguiente
pantalla del asistente para identificar el tipo de rastreo de cambios. Observe
que las columnas son automáticamente coincididas entre la entrada de origen y
la dimensión de destino, porque tienen el mismo nombre y tipo de datos. En
otras situaciones, puede que tenga que realizar manualmente las coincidencias.
14. En la siguiente pantalla del asistente
SCD, necesita identificar qué tipo de cambio es identificado para cada columna correspondiente.
Ya se ha mencionado que todas las columnas son atributos cambiantes para la
dimensión DimSalesTerritory; por lo tanto, seleccionar todas las columnas y escoger
la opción "Changing Attribute" de Change Type de las listas
desplegables, como es mostrado en la figura.
Existen
tres opciones para el Change Type: Changing Attribute, Historical Attribute, y Fixed
Attribute. Un Change Attribute
es actualizado si el valor de origen cambia. Para el Historical Attribute,
cuando un cambio ocurre, un nuevo registro es generado, y el viejo registro
preserva el histórico del cambio. Por último, un Fixed Attribute significa que
no deben ocurrir cambios, y el ETL debe ignorar el cambio.
15. En la siguiente pantalla, titulada
"Fixed and Changing Attribute Options", se le pide que elija qué
registros desea actualizar cuando un valor de origen cambia. La opción "Fixed
Attributes" está en gris, porque no fueron seleccionados atributos fijos
en la pantalla anterior. Bajo la opción "Changing Attributes", puede escoger
por actualizar la columna Changing Atrribute para todos los registros que
coinciden con la misma llave candidata, o puede optar por actualizar sólo el
más reciente. No importa en este caso porque, sólo habrá un registro por valor
de llave candidata, ya que no hay atributos históricos que podrían causar un
nuevo registro. Deja esta casilla desmarcada y pasa a la siguiente pantalla.
16. La pantalla "Inferred Dimension
Members" es acerca del manejo de los registros de los marcadores de
posición que fueron agregados durante la carga de tabla de hechos, debido a que
un miembro de dimensión no existía cuando la carga de la fact fue ejecutada.
Desmarque la casilla de verificación Enabled Inferred Dimension Members y pase
a la siguiente pantalla. Los miembros inferidos son cubiertos en la ETL de la dimensión
DimEmployee, más adelante en este post.
17. Dada la simplicidad de la dimensión
Sales Territory, esto concluye el asistente, y en la última pantalla
simplemente confirma los ajustes que ha configurado. Seleccione Finish para
completar el asistente.
El resultado neto del asistente SCD es que generará
automáticamente varias transformaciones posteriores, preconfiguradas para
manejar los tipos de cambio basados en las llaves candidatas seleccionadas. La
figura muestra el Data Flow completo con la Transformación SCD.
Desde que esta dimensión es simple, sólo hay dos salidas.
Una salida es llamada Nueva Salida, que insertará nuevos registros de dimensión
si la llave candidata identificada del origen no tiene una coincidencia en la
dimensión. La segunda salida, llamada Salida de Actualizaciones de Atributos
Variables, es utilizada cuando tiene una coincidencia a través de las llaves
candidatas y uno o más de los atributos cambiantes no coinciden entre la
entrada de origen y la tabla de dimensión. Este comando OLE DB utiliza una sentencia
UPDATE para realizar la operación.
Cargando una Tabla de Dimensión Compleja
La ETL de una dimensión a menudo requiere una lógica
complicada que causa que las tareas del proyecto de dimensión tomen mayor
cantidad de tiempo para el diseño, desarrollo y prueba. Esto es debido al cambio
de requerimientos para varios atributos dentro de una dimensión así como el rastreo
del histórico, la actualización de registros de miembros inferidos, y así
sucesivamente. Por otra parte, con dimensiones más grandes o más complicadas,
las tareas de preparación de datos a menudo requieren más lógica y más
transformaciones antes que el histórico sea aún manejado en la tabla de
dimensiones.
Preparando los Datos
Como un ejemplo de un proceso ETL de dimensión más
complicada, en esta sección creará un paquete para la tabla DimEmployee. Este
paquete tratará con algunos datos faltantes:
1.
En
el proyecto SSIS, crear un nuevo paquete llamado ETL_DimEmployee.dtsx. Puesto que ya ha creado las conexiones de
proyectos para AdventureWorks2014 y AdventureWorksDW2014, no necesita agregarlos
para el nuevo paquete DimEmployee SSIS.
2.
Crear
una tarea Data Flow y agregar un componente de Origen de OLE DB al Data Flow.
3. Configurar el componente Origen de OLE
DB para conectar a la conexión AdventureWorks2014 y cambiar el Data Access Mode
a SQL Command. Luego, ingrese el siguiente código SQL en la ventana de texto
SQL Command (ver figura):
SELECT
e.NationalIDNumber as EmployeeNationalIDAlternateKey
, manager.NationalIDNumber as
ParentEmployeeNationalIDAlternateKey
, s.FirstName, s.LastName, s.MiddleName, e.JobTitle as
Title
, e.HireDate, e.BirthDate, e.LoginID, s.EmailAddress
, s.PhoneNumber as Phone, e.MaritalStatus, e.SalariedFlag
, e.Gender, e.VacationHours, e.SickLeaveHours,
e.CurrentFlag
, s.CountryRegionName as SalesTerritoryCountry
, s.TerritoryGroup as SalesTerritoryGroup
, s.TerritoryName as SalesTerritoryRegion
, s.StateProvinceName
FROM [Sales].[vSalesPerson] s
INNER JOIN [HumanResources].[Employee] e
ON e.[BusinessEntityID] = s.[BusinessEntityID]
LEFT OUTER JOIN HumanResources.Employee manager
ON (e.OrganizationNode.GetAncestor(1)) =
manager.[OrganizationNode]
4.
Haga
clic en OK para guardar los cambios en el componente Origen de OLE DB.
5.
Arrastre
una transformación Lookup al Data Flow y conectar la salida de ruta de datos
azul desde el Origen de OLE DB a la Lookup. Nombre el Lookup Sales Territory.
6.
Haga
doble clic en la transformación Lookup para abrir el Lookup Transformation Editor.
En la página General, cambie el menú desplegable llamado "Specify How to
Handle Rows with no Matching entries" a "Redirect Rows to No Match
Output". Deje el Cache Mode como Full Cache y la Connection Type como OLE
DB Connection Manager.
7.
En
la página de propiedades Connection, cambie la OLE DB Connection Manager a
AdventureWorksDW2014 y luego seleccione [dbo].[DimSalesTerritory] en la lista
desplegable de abajo llamada "Use a Table or a View".
8. En la página de propiedades Columns,
una las columnas SalesTerritoryCountry, SalesTerritoryGroup y
SalesTerritoryRegion entre las columnas de entrada y las columnas de búsqueda,
como se muestra en la figura. Además, seleccione la casilla de verificación junto
a SalesTerritoryKey en las columnas de búsqueda para retornar esta columna al Data
Flow.
Algunas de las columnas de territorio
de ventas en el origen tienen NULLs. TerritoryGroup y TerritoryName tienen una
relación funcional de uno-a-muchos. De hecho, suponga que ha conferenciado con los
usuarios del negocio, y confirmaron que se puede ver la StateProvinceName y
CountryRegionName, y si otro vendedor tiene la misma combinación de valores,
puede utilizar su información de SalesTerritory.
9.
Para
manejar los SalesTerritories faltantes con los requisitos anteriores, agregue
una segunda transformación Lookup en el Data Flow, y nómbrelo Get Missing Territories. Luego, conecte
la salida de ruta azul de la búsqueda Sales Territory a esta nueva búsqueda. Se
le pedirá que elija Output; seleccione Salida de Entradas no Coincidentes de
Búsqueda de la lista desplegable, como se muestra en la figura.
10. Editar la nueva Lookup y configure el
componente Origen de OLE DB para conectarse a la conexión AdventureWorks2014. Luego,
escoja la opción Use Results of an SQL Query. Escriba el siguiente código SQL
en la ventana de texto de SQL Command:
SELECT
DISTINCT
CountryRegionName
as SalesTerritoryCountry
,
TerritoryGroup as SalesTerritoryGroup
,
TerritoryName as SalesTerritoryRegion
,
StateProvinceName
FROM
[Sales].[vSalesPerson]
WHERE
TerritoryName IS NOT NULL
11. En la página de propiedades Columns,
una la SalesTerritoryCountry y StateProvinceName entre la lista de columnas de
entrada y de búsqueda y, luego, active las casillas de verificación junto a
SalesTerritoryGroup y SalesTerritoryRegion en la lista de búsqueda. Adjunte la
palabra "New" a los OutputAlias, como se muestra en la figura.
Luego, recreará la búsqueda SalesTerritory
de los pasos anteriores para obtener la Sales TerritoryKey para los registros
que originalmente tenían datos faltantes.
12. Añadir una nueva Lookup al Data Flow
llamado Readquirir SalesTerritory y
conecte la salida de la búsqueda Get Missing Territories (use la Salida de
Entradas Coincidentes de Búsqueda cuando se le solicite). En la ficha General,
edite la Lookup de la siguiente manera: deje la Cache Mode como Full Cache y Connection
Type como OLE DB Connection Manager.
13. En la página Connection, especifique
el administrador de conexión AdventureWorksDW y cambie la opción "Use a Table
or a View" en [dbo].[DimSalesTerritory].
14. En la página de propiedades Columns (mostrada
en la figura siguiente), coincida las columnas entre la tabla input y lookup,
asegurando que utiliza la columna Region y Group “New”. Coincide a través de SalesTerritoryCountry,
SalesTerritoryGroupNew y SalesTerritoryRegionNew. También retorna la
SalesTerritory Key y nombre su Output Alias a SalesTerritoryKeyNew.
15. Haga clic en OK para guardar los
cambios de la Lookup y luego arrastre una transformación Union All sobre el Data
Flow. Conecte dos entradas en la transformación Union All:
Ø
La
Salida de Entradas Coincidentes de Búsqueda de la búsqueda Sales Territory
ØLa Salida de Entradas Coincidentes de Búsqueda
de la búsqueda Reacquirir SalesTerritory
16. Editar la transformación Union All de
la siguiente manera: localizar la columna SalesTerritoryKey y cambiar el valor
<ignore> en el menú desplegable para la entrada que viene de la segunda
búsqueda para utilizar la columna SalesTerritoryKeyNew. Esto se muestra en la
figura siguiente.
17. Haga clic en OK para guardar los
cambios en la Union All. En este punto, el Data Flow debe ser similar a la que
aparece en la figura.
Estos pasos describen cómo manejar una
tarea de preparación de datos. Cuando comienza a preparar los datos para su
dimensión, es muy probable que tendrá que realizar varios pasos para tenerlo
listo para los cambios en los datos de dimensión.
Puede utilizar otras transformaciones
SSIS para este fin. Un par de ejemplos podrían incluir utilizar Derived Column
para convertir NULLs a UnKnowns y Fuzzy Lookup y Fuzzy Group para la limpieza de
datos sucios. También puede utilizar los Data Quality Services de SQL Server
2014 para ayudar a la limpieza de datos.
Manipular Cambios de Dimensión Complicados con la Transformación SCD
Ahora está listo para utilizar de nuevo el Asistente SCD,
pero para la tabla DimEmployee, necesita manejar diferentes tipos de cambios y
miembros inferidos:
1.
Continuar
el desarrollo agregando una transformación Slowly Changing Dimension al Data
Flow y conectando la salida de ruta de datos de la Unión All a la
Transformación SCD. Luego haga doble clic en la transformación SCD para iniciar
el Asistente SCD, en la página de Bienvenida dar clic en Next.
2.
En
la página Select a Dimension Table and Keys, seleccione el Administrador de
conexiones AdventureWorksDW2014 y la tabla [dbo].[DimEmployee].
a. En
este ejemplo, no todas las columnas han sido extraídos del origen, y otras
columnas de destino están relacionadas a la gestión de cambio de dimensión, que
es identificada en el paso siguiente. Por lo tanto, no todas las columnas serán
automáticamente emparejadas entre las columnas de entrada y las columnas de
dimensión.
b. Encuentra
la EmployeeNationalIDAlternateKey y cambie el Key Type a Business Key.
c.
Seleccione
Next.
3. En la página Slowly Changing Dimension
Columns, haga las siguientes designaciones de Change Type, como es mostrado en
la figura siguiente:
a. Fixed
Attributes: BirthDate, HireDate
b. Changing
Attributes: CurrentFlag, EmailAddress, FirstName, Gender, LastName, LoginID,
MaritalStatus, MiddleName, Phone, SickLeaveHours, Title, VacationHours
c. Historical
Attributes: ParentEmployeeNationalIDAlternateKey, SalariedFlag,
SalesTerritoryKey
4.
En
la página Fixed and Changing Attribute Options, desactive la casilla de
verificación bajo la etiqueta Fixed Attributes. El resultado de esto es que
cuando un valor cambia para una columna identificada como Fixed Attribute, el
cambio será ignorado, y el valor antiguo en la dimensión no será actualizado.
Si había marcado esta casilla, el paquete podría fallar.
5.
En
la misma página, marque la casilla bajo Changing Attributes. Como se describió
anteriormente, esto asegura que todos los registros (actuales e históricos) serán
actualizados cuando un cambio ocurre a
un Changing Attribute.
6. Ahora se le pedirá que configure la Historical
Attribute Options, como es mostrada en la figura siguiente. La transformación
SCD necesita saber cómo identificar el registro actual cuando una sola Business
Key tiene varios valores (recordar que cuando un Historical Attribute cambia,
una nueva copia del registro es creada). Hay dos opciones disponibles. Uno de
ellos, una sola columna es utilizada para identificar el registro. La mejor
opción es utilizar una fecha de inicio y de fin. La tabla DimEmployee tiene una
columna StartDate y EndDate; por lo tanto, utilice el botón de opción de la segunda
configuración y ajuste la "Start Date Column" a StartDate y la "End
Date Column" a EndDate. Por último, establezca la lista desplegable "Variable
to Set Date Values" a System::StartTime.
7.
Suponga
por este ejemplo que es posible que tenga registros de dimensión faltantes
cuando procesa la tabla de hechos. En este caso, un nuevo miembro inferido es agregada
a la dimensión. Por lo tanto, en la página Inferred Dimension Members, deje la
opción "Enable Inferred Member Support" marcada. La transformación
SCD necesita saber cuándo un miembro de dimensión es un miembro inferido. La
mejor opción es tener una columna que identifique el registro como inferido;
sin embargo, la tabla DimEmployee no tiene una columna para este propósito. Por
lo tanto, deje la opción "All Columns with a Change Type are Null" seleccionada.
8.
Con
esto concluye la configuración del asistente. Haga clic en Finish para que la transformación
SCD puede construir las transformaciones posteriores necesarias en base a las
configuraciones. Su Data Flow ahora será similar a la mostrada en la figura siguiente.
Cargando Tabla de Hechos
La carga de la Tabla de hechos es a menudo más sencilla
que la ETL de dimensiones, porque una tabla de hechos usualmente implica solo inserciones
y, ocasionalmente, actualizaciones. Cuando trata con grandes volúmenes, es
posible que necesite manejar inserciones particionadas y hacer frente a actualizaciones
en una manera diferente.
En general, la carga de la tabla de hechos implica
algunas tareas comunes:
Ø
Preparar
los orígenes de datos para tener la misma granularidad como su tabla de hechos,
incluyendo tener las llaves de negocio de dimensión y medidas en los datos de
origen
Ø
Adquirir
las llaves sustitutas de dimensión para cualquier dimensión relacionada
Ø Identificar
los nuevos registros para la tabla de hechos (y potencialmente actualizaciones)
La tabla de hechos Sales Quota es relativamente sencilla
y le dará un buen comienzo hacia el desarrollo de un ETL de una tabla de hechos:
1. En
su proyecto SSIS para este capítulo, crear un nuevo paquete y renómbrelo ETL_FactSalesQuota.dtsx.
2.
Al
igual que los otros paquetes que desarrolló en este post, utilizará dos administradores
de conexiones, una para AdventureWorks2014, y el otro para AdventureWorksDW2014,
que ya fueron creados anteriormente.
3. Crear una nueva tarea Data Flow y
añadir un componente Origen de OLE DB. Nómbrela Sales Quota Source. Configure el componente Origen de OLE DB para
conectarse con el administrador de conexión AdventureWorks2014, y cambie el Data
Access Mode a SQL Command, como es mostrado en la figura siguiente. Agregue el
código siguiente a la ventana SQL Command Text:
SELECT QuotaDate, SalesQuota, NationalIDNumber as
EmployeeNationalIDAlternateKey FROM
Sales.SalesPersonQuotaHistory
INNER JOIN HumanResources.Employee
ON SalesPersonQuotaHistory.BusinessEntityID =
Employee.BusinessEntityID
4. Para
adquirir las llaves sustitutas de las tablas de dimensión, utilizará una
transformación Lookup. Arrastre una transformación Lookup al Data Flow y conecte
la salida de ruta de datos azul del componente Origen de OLE DB sobre la
transformación Lookup. Renombre la Lookup a Employee Key.
5.
Haga
doble clic en la transformación Employee Key para abrir el Lookup
Transformation Editor. En la página de propiedades General, deje el Cache Mode
establecido a Full Cache y el Connection Type establecido a OLE DB Connection
Manager.
6. En la página de propiedades Connection,
cambie el desplegable OLE DB Connection Manager a AdventureWorksDW2014 e
introduzca el siguiente código:
SELECT EmployeeKey, EmployeeNationalIDAlternateKey
FROM DimEmployee
WHERE
EndDate IS NULL
Incluyendo el filtro EndDate IS NULL asegura que la llave sustituta del
registro de dimensión más actual es adquirida en la Lookup.
7. Cambie a la página de propiedades Columns
y asigne el EmployeeNationalIDAlternateKey de las columnas input a las columnas
lookup. Luego, seleccione la casilla de verificación junto a la EmployeeKey de
la Lookup, como es mostrada en la figura siguiente.
8.
Haga
clic en OK para guardar los cambios a la transformación Lookup.
9.
Para
el DateKey, una Lookup no es necesaria porque el DateKey es una "llave
inteligente", es decir, la llave es un valor entero basado en la misma
fecha en formato YYYYMMDD. Por lo tanto, utilizará una Derived Columnda para
calcular la DateKey para la tabla de hechos. Añadir una transformación Derived Column
al Data Flow y conectar la salida de ruta de datos azul de la Employee Lookup a
la transformación Derived Column. Cuando se le solicite, seleccione Salida de Entradas
Coincidentes de Búsqueda. Nombre la Derived Column como Date Keys.
10. Haga doble clic en la transformación Derived
Column y agregue las siguientes tres nuevas columnas Derived Column y sus
expresiones asociadas, como se muestra en la figura siguiente:
DateKey:
YEAR([QuotaDate]) *10000 + MONTH([QuotaDate]) *100 + DAY([QuotaDate])
CalendarYear:
(DT_I2) YEAR([QuotaDate])
CalendarQuarter:
(DT_UI1) DATEPART(“q”,[QuotaDate])
En este punto de su Data Flow, los
datos están listos para la tabla de hechos. Si los datos ya han sido extraídos incrementalmente,
por lo que está obteniendo sólo las filas nuevas, puede utilizar un Destino de
OLE DB para insertarlo justo a la tabla de hechos. Suponga para este tutorial
necesita identificar qué registros son nuevos y que registros son
actualizaciones y manejarlos adecuadamente. El resto de los pasos realizan las actualizaciones
e inserciones de la fact.
Una Merge Join será utilizada para
coincidir registros de entrada de origen a los registros de tabla de hecho
actual, pero antes de agregar la Merge Join, necesita agregar una transformación
Sort a los registros de origen (un requisito de la Merge Join) y extraer los
datos de hecho en el Data Flow.
11. Agregar una transformación Sort al Data Flow y conectar la salida de ruta de
datos azul de la transformación Derived Column a la transformación Sort. Haga
doble clic en la transformación Sort para abrir el Sort Transformation Editor y
ordenar los datos de entrada por las siguientes columnas: EmployeeKey,
CalendarYear y CalendarQuarter, como es mostrado en la figura siguiente. El
CalendarYear y CalendarQuarter son columnas importantes para esta tabla de
hechos porque identifican el grano de fecha,
el nivel de detalle con el que la tabla de hechos es asociada con la dimensión Date.
Como regla general, la transformación Sort es una transformación muy poderosa,
siempre y cuando esté trabajando con tamaños de datos manejables, en miles y
millones, pero no en decenas o cientos de millones (si tiene una gran cantidad
de memoria, puede escalar hacia arriba también). Una alternativa al Sort es
descrita más adelante.
La figura muestra lo que su Data Flow
debe mostrar en este punto.
12. Agregar un nuevo componente Origen de
OLE DB al Data Flow y nómbrelo Sales
Quota Fact. Configure el Origen de OLE DB para utilizar el administrador de
conexión AdventureWorksDW2014 y utilizar el siguiente SQL Command:
SELECT EmployeeKey, CalendarYear
, CalendarQuarter,
SalesAmountQuota
FROM dbo.FactSalesQuota
ORDER BY 1,2,3
13. Debido a que está utilizando una sentencia
ORDER BY en la consulta (ordenando por las
tres primeras columnas en orden), necesita configurar el componente Origen de OLE
DB para saber qué datos están entrando al Data Flow ordenados. En primer lugar,
haga clic en OK para guardar los cambios al Origen de OLE DB y luego haga clic derecho
en el componente Sales Quota Fact y seleccione Show Advanced Editor.
14. En la pestaña Input and Output
Properties, haga clic en el objeto Salida de Origen de OLE DB en la ventana
izquierda; en la ventana derecha, cambie la propiedad IsSorted a True, como es
mostrada en la figura siguiente.
15. Expanda la Salida de Origen de OLE DB
de la izquierda y luego expanda la carpeta Output Columns. Realice los
siguientes cambios en las propiedades Output Column:
a. a. Seleccione
la columna EmployeeKey y cambie su SortKeyPosition a 1, como es mostrado en la
figura siguiente. (Si el orden de sort es descendente, debería escribir un -1
en la SortKeyPosition).
b.
Seleccione
la columna CalendarYear y cambie su SortKeyPosition a 2.
c. c. Seleccione
la columna CalendarQuarter y cambie su SortKeyPosition a 3.
d. Haga clic en OK para guardar los
cambios en las propiedades avanzadas.
16. Agregar una transformación Merge Join al
Data Flow. En primer lugar, conecte la salida de ruta de datos azul de la transformación
Sort sobre la Merge Join. Cuando se le solicite, seleccione la opción input
llamada Entrada Izquierda de Combinacion de Mezcla. A continuación, conecte la
salida de ruta de datos azul del origen Sales Quota Fact a la Merge Join.
17. Haga doble clic en la transformación Merge
Join para abrir su editor. Verá que las columnas EmployeeKey, CalendarYear y
CalendarQuarter ya están unidas entre las entradas. Realice los siguientes
cambios, como es mostrado en la figura:
a. Cambiar
la lista desplegable Join Type a Left Outer Join.
b. b. Marque
las columnas SalesQuota, EmployeeKey, DateKey, CalendarYear, CalendarQuarter y
QuotaDate de la lista de entrada Sort y cambie el alias de salida para
QuotaDate a Date.
c. Marque el SalesAmountQuota de la lista
de columnas Sales Quota Fact y luego cambie la Output Alias para esta columna a
SalesAmountQuota_Fact.
18. Haga clic en OK para guardar su
configuración Merge Join.
19. Su próximo objetivo es identificar cuales
registros son nuevas cuotas y cuales son cuotas de ventas cambiadas. Una Conditional
Split será utilizada para realizar esta tarea; por lo tanto, arrastre una
transformación Conditional Split sobre el Data Flow y conecte la salida de ruta
de datos azul de la transformación Merge Join a la Conditional Split. Renombrar
la Conditional Split a Identify Inserts and Updates.
20. Haga doble clic en la Conditional
Split para abrir el editor y hacer los siguientes cambios, como se muestra en
la figura:
a.
Agregar
una nueva condición llamada New Fact Records
con la siguiente condición: ISNULL([SalesAmountQuota_Fact]).
Si la medida del fact es null, indica que el registro del fact no existe por
combinar el empleado y la fecha.
b.
Añadir
una segunda condición llamada Fact
Updates con la siguiente condición: [SalesQuota] != [SalesAmountQuota_Fact].
c. Cambiar el nombre de salida por
defecto a No Changes.
21. Haga clic en OK para guardar los
cambios en la Conditional Split.
22. Agregar un componente Destino de OLE
DB al Data Flow y nómbrelo como Fact Inserts.
Arrastre la salida de ruta de datos azul de la transformación Conditional Split
al Destino de OLE DB. Cuando se le pide que elija una salida del Condicional
Split, elija la salida New Fact Records.
23. Haga doble clic en el destino Fact Inserts
y cambie el OLE DB Connection Manager a AdventureWorksDW2014. En la lista
desplegable "Name of the Table or View ", seleccione la tabla [dbo].[FactSalesQuota].
24. Cámbiese a la página de propiedades
Mappings y enlazar la columna SalesQuota de la lista Available Input Columns a
la SalesAmountQuota en la lista Available Destinations Columns, como se muestra
en la figura. Las otras columnas (EmployeeKey, DateKey, CalendarYear y
CalendarQuarter) deberían ya coincidir. Haga clic en OK para guardar los
cambios en el Destino de OLE DB.
25. Para manejar las actualizaciones de la
tabla de datos, arrastre una transformación OLE DB Command al Data Flow y renómbrela
Fact Updates. Arrastre la salida de ruta
de datos azul de la Conditional Split sobre la transformación Fact Updates, y
cuando se le solicite, seleccione la salida Fact Update de la Conditional Split.
26. Haga doble clic en la transformación
OLE DB Command y cambie en la lista desplegable Connection Manager a
AdventureWorksDW2014. En la ficha Component Properties, agregue el código
siguiente a la propiedad SQLCommand (asegúrese de hacer clic en el botón de
puntos suspensivos para abrir una ventana del editor):
UPDATE dbo.FactSalesQuota
SET SalesAmountQuota = ?
WHERE EmployeeKey = ?
AND CalendarYear = ?
AND CalendarQuarter = ?
27. Cambie a la ficha Column Mappings y asigne
la SalesQuota a Param_0, Employee_Key a Param_1, CalendarYear a Param_2 y CalendarQuarter
a Param_3, como es mostrada en la figura.
28. Haga clic en OK para guardar los
cambios en la actualizada OLE DB Command. Su ETL de Tabla de Hechos para la
FactSalesQuota está completa y debería ser similar a la figura.
ALTER
TABLE [dbo].[FactSalesQuota]
DROP CONSTRAINT
[FK_FactSalesQuota_DimDate]
Estas son algunas consideraciones finales para la ETL de
la tabla de hechos:
Ø
Un
Merge Join fue utilizado en este caso para ayudar a identificar qué registros
fueron actualizaciones o insertados, basados en la coincidencia del origen a la
tabla de hechos.
Ø
Para
las inserciones y actualizaciones, es posible que desee aprovechar el motor
relacional para manejar bien la inserción o la actualización al mismo tiempo.
T-SQL en SQL Server soporta una sentencia MERGE
que realizará ya sea una inserción o una actualización dependiendo de si el
registro existe.
Ø
Otra
alternativa a las actualizaciones de la tabla de hechos al OLE DB Command es
utilizar una actualización basada en conjuntos. El OLE DB Command funciona bien
y es fácil para pequeños volúmenes de datos; sin embargo, su situación puede no
permitir actualizaciones por fila. Considere el staging de las actualizaciones
a una tabla y luego realizar una actualización basada en conjuntos (a través de
una sentencia UPDATE multifila de SQL) para unir la tabla staging a la tabla de
hechos y actualizar la cuota de ventas de esa manera.
Ø
Las
inserciones son otra área de consideraciones de mejora. Las Tablas de Hechos a
menudo contienen millones de filas, por lo que debe buscar formas de optimizar
las inserciones. Considere la eliminación de los índices, la carga de la tabla
de hechos, y luego volver a crear los índices. Esto podría ser mucho más
rápido.
Ø
Si
tiene particiones en su lugar, puede insertar los datos en la tabla de hechos
particionada; sin embargo, cuando está tratando con grandes volúmenes, la
sobrecarga del motor relacional puede inhibir el rendimiento. En estas
situaciones, considere cambiar la partición actual con el fin de cargarla por
separado, entonces puede cambiar de nuevo en la tabla particionada.
Los miembros inferidos son otro reto para el ETL de tabla
de hechos. ¿Cómo manejar una llave de dimensión faltante? Un enfoque incluye el
escaneo del origen de la tabla de hechos para las llaves faltantes y la adición
de registros de dimensión de miembro inferido antes que la ETL de la tabla de
hechos se ejecute. Una alternativa es redirigir la fila faltante cuando la
búsqueda no tiene una coincidencia, luego, agregar la llave de dimensión
durante el ETL, seguido por traer la fila de regreso al ETL a través de un Union
All. Una aproximación final es manejar los miembros inferidos después que la
ETL de la tabla de hechos finalice. Necesitaría un stage de los registros que
tienen llaves faltantes, agregar los miembros inferidos, y luego reprocesar los
registros staged en la tabla de hechos.
2 comentarios:
Debido a una consulta de este tema, he preparado este Post de una carga de tablas de Dimension y de Fact, y prepararé dos más. Pero quiero indicar que este tema es demasiado amplio. Espero les sea de utilidad.
Profe Narcizo, tengo dos consultas:1) si deseas cargar 2 millones de registros de una tabla y otro 10000 mil registros, que consideraciones debemos tener para los 2 millones.2) que tienen en común todos los ETL de diferentes fabricantes
Publicar un comentario