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.
proyecto invernadero desde el departamento de tecnología para Erasmus
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