Ejemplo de data quality con Talend

Data Quality

Cada vez es más importante imprimir calidad en todos los procesos de gestión de la información; al almacenarla, transmitirla y sobre todo al incorporarla a nuestros repositorios.

La duplicidad de datos cuesta muchísimo dinero en almacenamiento y transmisión de datos, pero sobre todo genera ineficiencias en todos nuestros procesos. Mantener una base de datos correctamente normalizada organiza la información y facilita el análisis y localización de los datos.

 

Para ver las capacidades de transformación de datos y data quality de Talend, vamos a abordar un ejemplo en el que tenemos una fuente de datos externa que debemos incorporar a nuestra base de datos.

Nuestro ejemplo consiste en una gran base de datos de libros, que recibe aportes externos desde hipotéticos proveedores. Vamos a incorporar un fichero que incluye los siguientes campos:

 

  • id
  • ISBN
  • Título
  • Idioma

 

1|9788432210006|El Enredo De La Bolsa y La Vida|esapañol
2|9788497662093|La Vida D Antoni Gaudi|catalan
3|978-0156013987|Le Petit Prince|francés
4|978 8497826280|O Único que Queda é o Amor|Galleho
5|9788496208919|Juego de Tronos: Canción de Hielo y Fuego 1|Castellano

 

La fuente de datos externa incorpora errores tipográficos en el campo idioma, que para nosotros en un campo normalizado; que utiliza una tabla de dominio con los posibles valores, además en el campo ISBN encontramos distintos formatos para la cadena.

Nuestro objetivo es adecuar los datos de entrada para la incorporación a nuestra base de datos normalizada.

 

Descripción del proceso

Realizaremos el proceso en varios pasos:

  • Limpieza inicial
  • Concordancia por aproximación
  • Sustitución por valores normalizados

 

Proceso de normalización de datos

Proceso de normalización de datos

 

Limpieza Inicial

Nuestro fichero de entrada incorpora datos de varias fuentes, o datos grabados a mano. Para integrarlo a nuestra base de datos, el primer paso es detectar aquellas filas que contienen valores incorrectos, e identificarlas. Incluso aquellas filas que contienen datos válidos, pueden contenerlos en un formato distinto al de nuestra base de datos; para solucionar esto vamos a aplicarles unas funciones, para limpiar y formatear los datos de entrada.

 

    public static String capitalize(String message) {
        return message.substring(0, 1).toUpperCase() + message.substring(1).toLowerCase();
    }
   
    public static String isbnFormat(String isbn) {
        String tmpString = isbn.replaceAll("[^0-9]", "");
        try{
            tmpString = tmpString.substring(0, 3) + "-" + tmpString.substring(4);
        }      
        catch(Exception ex){
            tmpString ="000-0000000000";
        }
        return tmpString;
    }

 

Hemos creado dos funciones, una para capitalizar el contenido del campo idioma, y otra para dar formato al campo ISBN. En la vida real Los ISBN se validarían con la función de validación del EAN13 y aquellas tuplas que no pasen la validación, se almacenarán en un para posterior revisión generando una alerta.

En el ejemplo actual nos estamos limitando a quitar todos aquellos caracteres no numéricos y darle formato al resultado según nuestro estándar.

 

Limpieza inicial

Aplicamos las funciones que hemos creado

 

Matcheo por aproximación

Como primer paso en la normalización del campo language, vamos a hacer coincidir los valores de idioma en los datos de entrada, con una lista maestra de idiomas válidos. Para esto hemos creado un CSV con valores únicos válidos; que no tienen por que coincidir con nuestros valores normalizados.

 

Castellano
Calatán
Inglés
Francés
Alemán
Gallego
Euskera
Español
Vasco

 

tFuzzyMatch

Es un componente que nos permite detectar y corregir errores al teclear un dato. Podemos utilizar varios algoritmos Levenshtein, o Metaphone. El primero es el algoritmo básico de detección de distancia y el segundo es un algoritmo de detección de pronunciaciones similares. El componente incorpora dos versiones de este algoritmo: Metaphone y Double-Metaphone.

Metaphone es una evolución del antiguo Soundex es útil para textos en inglés, en castellano el “mispelling fonético” no es habitual, por eso vamos a utilizar Levenshtein. Levenshtein indica la distancia entre dos cadenas entendiendo como distancia el número de transposiciones necesarias para convertir una cadena en otra. Por defecto un cambio de “case” es considerado una transposición, aunque podemos indicar lo contrario; en el ejemplo actual no nos afecta ya que hemos utilizado un “case” homogéneo entre en las cadenas de entrada y las de muestra.

El tFuzzyMatch tiene dos entradas de datos. La principal que es la que contiene los datos a normalizar y una entrada de “lookup” con nuestros datos maestros.

 

Configuración de distancia Levenshtein

Configuración de distancia Levenshtein

 

En la salida encontramos los datos de entrada y dos columnas extra; el valor propuesto (MATCHING), y la distancia Levenshtein para cada caso (VALUE). Si no es posible encontrar una concordancia según los parámetros de distancia mínima y máxima indicados, las dos columnas extras contendrán null.

 

tLogRow

tLogRow es un componente que nos permite sacar por pantalla los datos que van pasando por un punto determinado del flujo de datos. Dispone de diferentes opciones de visualización. Para nuestro ejemplo vamos a visualizar los datos como una tabla, al estilo de MySQL.

Esto nos saca por pantalla los datos de salida del tFuzzyMatch:

 

--+-------------+-------------------------------------------+----------+-----+----------.
|                                       tLogRow_2                                        |
|=-+-------------+-------------------------------------------+----------+-----+---------=|
|id|isbn         |title                                      |language  |VALUE|MATCHING  |
|=-+-------------+-------------------------------------------+----------+-----+---------=|
|1 |978-432210006|El Enredo De La Bolsa y La Vida            |Esapañol  |1    |Español   |
|2 |978-497662093|La Vida D Antoni Gaudi                     |Catalan   |3    |Calatán   |
|3 |978-156013987|Le Petit Prince                            |Francés   |0    |Francés   |
|4 |978-497826280|O Único que Queda é o Amor                 |Galleho   |1    |Gallego   |
|5 |978-496208919|Juego de Tronos: Canción de Hielo y Fuego 1|Castellano|0    |Castellano|
'--+-------------+-------------------------------------------+----------+-----+----------'

 

El tLogRow no realiza cambios sobre el los datos o el esquema y a su salida encontramos el mismo flujo de datos que teníamos en la entrada.

 

En este ejemplo no estamos haciendo nada con los valores no coincidentes, pero en el mundo real separaríamos esas filas del flujo principal, para tratarlas de alguna forma.

 

Sustitución por valores normalizados

A esta altura del proceso ya tenemos unos valores libres de errores para el campo language; pero no tienen por qué coincidir con nuestros valores normalizados. Por ejemplo hemos identificado dos valores válidos para el idioma “castellano” (Castellano y Español) y hemos decidido que el valor normalizado para ambos sea “Castellano”. Sólo queda hacer la sustitución de unos valores por los otros. Para esto hemos hecho una lista que aplicamos con un tMap.

 

Español,Castellano
Vasco,Euskera
English,Inglés

 

tMap para la sustitución

tMap para la sustitución

 

La lista de sustitución se introduce como “lookup” en el tMap, e internamente se “mapea” de manera que conseguimos el dato de sustitución para aquellos valores de language coincidentes.

 

Esté sería nuestro resultado, unas filas limpias y preparadas para la carga:

 

.--+-------------+-------------------------------------------+----------.
|                               tLogRow_1                               |
|=-+-------------+-------------------------------------------+---------=|
|id|isbn         |title                                      |language  |
|=-+-------------+-------------------------------------------+---------=|
|1 |978-432210006|El Enredo De La Bolsa y La Vida            |Castellano|
|2 |978-497662093|La Vida D Antoni Gaudi                     |Calatán   |
|3 |978-156013987|Le Petit Prince                            |Francés   |
|4 |978-497826280|O Único que Queda é o Amor                 |Gallego   |
|5 |978-496208919|Juego de Tronos: Canción de Hielo y Fuego 1|Castellano|
'--+-------------+-------------------------------------------+----------'

 

Talend dispone de un componente llamado tReplaceList para hacer este tipo de sustituciones, que podríamos haber utilizado en vez del tMap.

Un saludo a todos y hasta la próxima.

Alberto Pérez

 

 

 

Un comentario para “Ejemplo de data quality con Talend”

Deja un comentario

?>