http://bit.ly/SQSummit
A través de ejemplos vamos a ver porque las herramientas actuales de integración de datos han de experimentar una evolución significativa, tanto en su forma como en su fondo.
SolidQ Summit 2018 - Todo lo que un integrador de datos debería tener... y parece que se nos olvida...
1. Todo lo que Un integrador de datos debería tener…
y parece que se nos olvida…
2. Soy experto en
creación de ETL
Se un montón de T-SQL
Sé un montón de SSIS
Me conozco el libro de Kimball mejor que el menú
de Mcdonals
Hace 15 años que prácticamente hago etls
Y sin embargo
Mis ETL siguen fallando
Algunos problemas los evalúo un tiempo después
y me asusta mi código
Cada vez que falla algo en producción, mi log
tiene mil cosas estúpidas pero ni una pista de
porque
Me cuesta dar un montón de explicaciones
3. • ETL sirve para proveer de conocimiento
• Pero nos centramos en datos
En que falla la industria
• Tenemos que describir el cómo
No nos basta con saber el qué
• Pero olvidamos el propósito
Nos centramos en los detalles
• Mi proceso ha funcionado… tu sabras porque no cuadra
Nos pasa como en Desarrollo
4. Agenda
Estado del arte de la creación de ETL’s
Patrones ETL-ELT.Staging-orquestacion
Aprendiendo de DEV
Conclusiones
7. Estado del Arte III
SSIS
Pentaho Data Integrator (spoon) <component
refId="PackageLoadDataLoad Staging TableSTG"
componentClassID="Microsoft.OLEDBSource"
contactInfo="OLE DB Source;Microsoft Corporation; Microsoft SQL Server; (C) Microsoft Corporation; All Rights Reserved; http://www.microsoft.com/sql/support;7"
name="STG"
usesDispositions="true"
version="7">
<properties>
<property
dataType="System.Int32"
description="The number of seconds before a command times out. A value of 0 indicates an infinite time-out."
name="CommandTimeout">0</property>
<property
dataType="System.String"
description="Specifies the name of the database object used to open a rowset."
name="OpenRowset"></property>
<property
dataType="System.String"
description="Specifies the variable that contains the name of the database object used to open a rowset."
name="OpenRowsetVariable"></property>
<property
dataType="System.String"
description="The SQL command to be executed."
name="SqlCommand"
UITypeEditor="Microsoft.DataTransformationServices.Controls.ModalMultilineStringEditor, Microsoft.DataTransformationServices.Controls, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91">SELECT [FirstName] ,[FullName] ,[idCustomer] ,[LastName] ,[MiddleName] ,[pkCustomerID] ,[Title] FROM etl.vw_dim_Customer ;</property>
<property
dataType="System.String"
description="The variable that contains the SQL command to be executed."
name="SqlCommandVariable"></property>
<property
dataType="System.Int32"
description="Specifies the column code page to use when code page information is unavailable fromthe data source."
name="DefaultCodePage">1252</property>
<property
dataType="System.Boolean"
description="Forces the use of the DefaultCodePage property value when describing character data."
name="AlwaysUseDefaultCodePage">false</property>
<property
dataType="System.Int32"
description="Specifies the mode used to access the database."
name="AccessMode"
typeConverter="AccessMode">2</property>
<property
dataType="System.String"
description="The mappings between the parameters in the SQL command and variables."
name="ParameterMapping"></property>
</properties>
<connections>
<connection
refId="PackageLoad DataLoad Staging TableSTG.Connections[OleDbConnection]"
connectionManagerID="{91D4C3C0-C280-487E-9E29-8337CE452461}:external"
connectionManagerRefId="Project.ConnectionManagers[STG1]"
description="The OLE DB runtime connection used to access the database."
name="OleDbConnection" />
</connections>
<outputs>
<output
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output]"
name="Output">
<outputColumns>
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[FirstName]"
dataType="wstr"
errorOrTruncationOperation="Conversion"
errorRowDisposition="FailComponent"
externalMetadataColumnId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[FirstName]"
length="50"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[FirstName]"
name="FirstName"
truncationRowDisposition="FailComponent" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[FullName]"
dataType="wstr"
errorOrTruncationOperation="Conversion"
errorRowDisposition="FailComponent"
externalMetadataColumnId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[FullName]"
length="161"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[FullName]"
name="FullName"
truncationRowDisposition="FailComponent" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[idCustomer]"
dataType="wstr"
errorOrTruncationOperation="Conversion"
errorRowDisposition="FailComponent"
externalMetadataColumnId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[idCustomer]"
length="15"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[idCustomer]"
name="idCustomer"
truncationRowDisposition="FailComponent" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[LastName]"
dataType="wstr"
errorOrTruncationOperation="Conversion"
errorRowDisposition="FailComponent"
externalMetadataColumnId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[LastName]"
length="50"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[LastName]"
name="LastName"
truncationRowDisposition="FailComponent" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[MiddleName]"
dataType="wstr"
errorOrTruncationOperation="Conversion"
errorRowDisposition="FailComponent"
externalMetadataColumnId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[MiddleName]"
length="50"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[MiddleName]"
name="MiddleName"
truncationRowDisposition="FailComponent" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[pkCustomerID]"
dataType="i4"
errorOrTruncationOperation="Conversion"
errorRowDisposition="FailComponent"
externalMetadataColumnId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[pkCustomerID]"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[pkCustomerID]"
name="pkCustomerID"
truncationRowDisposition="FailComponent" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[Title]"
dataType="wstr"
errorOrTruncationOperation="Conversion"
errorRowDisposition="FailComponent"
externalMetadataColumnId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[Title]"
length="8"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].Columns[Title]"
name="Title"
truncationRowDisposition="FailComponent" />
</outputColumns>
<externalMetadataColumns
isUsed="True">
<externalMetadataColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[FirstName]"
dataType="wstr"
length="50"
name="FirstName" />
<externalMetadataColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[FullName]"
dataType="wstr"
length="161"
name="FullName" />
<externalMetadataColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[idCustomer]"
dataType="wstr"
length="15"
name="idCustomer" />
<externalMetadataColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[LastName]"
dataType="wstr"
length="50"
name="LastName" />
<externalMetadataColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[MiddleName]"
dataType="wstr"
length="50"
name="MiddleName" />
<externalMetadataColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[pkCustomerID]"
dataType="i4"
name="pkCustomerID" />
<externalMetadataColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Output].ExternalColumns[Title]"
dataType="wstr"
length="8"
name="Title" />
</externalMetadataColumns>
</output>
<output
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Error]"
isErrorOut="true"
name="Error">
<outputColumns>
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Error].Columns[FirstName]"
dataType="wstr"
length="50"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Error].Columns[FirstName]"
name="FirstName" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Error].Columns[FullName]"
dataType="wstr"
length="161"
lineageId="PackageLoad DataLoad Staging TableSTG.Outputs[Error].Columns[FullName]"
name="FullName" />
<outputColumn
refId="PackageLoad DataLoad Staging TableSTG.Outputs[Error].Columns[idCustomer]"
dataType="wstr"
length="15"
8. Estado del arte IV
<OleDbSource Name="HLP" ConnectionName="HLP<#=helper.connection_id#>">
<DirectInput>SELECT * FROM <#=row["source_object_schema"]#>.<#=row["source_object_name"]#>
</DirectInput>
</OleDbSource>
BIML
9. Estado del arte V
Fabricantes
• En ejecución algunos códigos son
lamentables
• Mientras en SQL decimos el que TODOS
los fabricantes nos obligan a expresar el
COMO
• En algunos es imposible generar ese
código de forma automática
Industria
• Alguna empresa aprovecha los huecos
para hacer “facilities”
• Muchos nos hacemos frameworks que
ayudan un montón
• Nadie (o casi nadie que el mundo es muy
grande) se preocupa por cambiar el
paradigma
14. Aprendiendo desde desarrollo
• Desarrollo orientado a test
• Integración con código fuente
• Integración continua
• Devops
15. Aprendiendo desde Dev
Test en
desarrollo
• Test que se ejecutan una sola vez
• Test que ejecutamos periódicamente
• Ncientas queries que guardamos
por si acaso
Test para
producción
• Repetibles
• Metódicas
• Que aporten valor de negocio
• Que sean completas
16. Aprendiendo desde Dev
Test en
desarrollo
• Test que se ejecutan una sola vez
• Test que ejecutamos periódicamente
• Ncientas queries que guardamos
por si acaso
Test
• Repetibles
• Metódicas
• Que aporten valor de negocio
• Que sean completas
18. Integración con código fuente
• Sigue las prácticas de desarrollo
• Considera tus ETLS como código fuente
• Versiona-Etiqueta-Crea ramas
• Define tus prácticas y cúmplelas