En la
entrada anterior tratamos como pasar una tabla de un base de datos a otra, sin realizar ningún proceso intermedio, es decir, realizamos un proceso de Extracción y Carga, pero no aplicamos ningún tipo de Transformación sobre los datos, que es tal vez, la parte mas importante dentro del proceso ETL.
Kettle nos proporciona diversos pasos para manipular y limpiar los datos, ahorrándonos bastante escritura de código, y con la facilidad de que cada componente utilizado, realiza los procesos para todos registros del flujo, olvidándonos del manejo de ciclos, arrays o cursores, que en los lenguajes de programación tendríamos que controlar por nuestra cuenta. Cuando manejamos información de distintas fuentes, las cadenas de texto pueden llegar a ser un gran dolor de cabeza: espacios dobles, caracteres especiales, tildes, espacios a la izquierda o a la derecha, mayúsculas, minúsculas ... en fin problemas que si no se solucionan, pueden generar errores al realizar inserciones en la base de datos destino. En esta entrada trataré dos de los pasos más utilizados durante mi experiencia para realizar limpieza de información:
String Operations y
Replace in String.
Step String Operations
No hay mejor explicación que un ejemplo, así que para empezar, podemos arrastrar un paso String Operations entre el
Table Input y el
Table Output del ejemplo que tratamos en la
entrada anterior .
Esta transformación va a cambiar a mayúscula sostenida los atributos FIRST_NAME y LAST_NAME, de los datos obtenidos de la tabla EMPLOYEES del modelo HR. Para ello damos clic sobre el paso
String Operations y en la columna In
Stream Field, seleccionamos alguno de los campos del flujo que sean tipo String. Como podemos ver, podemos realizar operaciones sobre varias columnas a la vez.
Este step nos brinda opciones varias opciones
:
Trim Type: Permite quitar espacios en blancos, ya sea a la derecha, a la izquierda o a ambos lados de la cadena.
Lower/Upper: Nos da la opción de poner la cadena, en mayúscula o minúscula sostenida.
Padding, Pad Char y Pad Length: Con padding podemos elegir si queremos rellenar la cadena a la izquierda o a la derecha con el carácter definido en Pad Char, hasta la longitud definida en Pad Length. Ejemplo: si tenemos el cadena '11', definimos un Pad Cahr '0' y un Pad Length 5,el resultado será 00011.
InitCap: Agrega mayúscula inicial a la cadena, muy útil en el manejo de nombres propios.
Escape: una función muy útil para escapar caracteres especiales según un lenguaje de programación o formato de archivo. Por ejemplo, en XML, las letras tildadas, las cambiará a su respectivo código.
Digits: Deja solo los caracteres 0-9 si elegimos la opción
only, o los elimina por completo si dejamos la opción
remove.
Remove Special character: permite elegir entre una lista de caracteres especiales a remover, por ejemplo, los retornos de carro, espacios en blanco o tabuladores.
Volviendo a nuestro ejemplo, el paso
String operations quedará como muestra la imagen, simplemente se pasarán a mayúscula las columnas FIRST_NAME y LAST_NAME del flujo:
Step Replace in String
Otro paso muy útil en el manejo de cadenas es
Replace in String, que simplemente nos permite reemplazar una cadena por otra
.
En el ejemplo, lo podemos utilizar para reemplazar los puntos (.) en PHONE_NUMBER por guiones (-) . Para ellos arrastramos un Replace in String a la transformación, en In stream field elegimos PHONE_NOMBRE, en
Use Regex escribimos N para no utilizar expresiones regulares (La utilización de expresiones regulares la veremos en otra entrada) y en Search y Replace with, ponemos los cadenas a buscar y reemplazar (. por -), respectivamente, como lo muestra la imagen. Si la idea es desaparecer el carácter buscado, simplemente dejamos vacía la columan
Replace With.
Previsualizando el flujo de KETTLE
Hasta este punto, podemos realizar una pre visualización para ver como van nuestros datos transformados, haciendo clic en un paso y luego en el botón
Execute Preview. Nos aparecerá un diálogo donde nos pedirá confirmar la cantidad de filas a previsualizar. Como siempre les digo, evitemos poner un valor muy alto, si nuestra máquina de desarrollo no es muy potente o no hemos
configurado los parámetros de memoria de nuestro PDI. Finalmente clic en el botón Launch.
Con estos dos steps, ya podemos idear varias transformaciones para realizar limpieza de información. ¿Que tal reemplazar todos los espacios dobles por uno solo? o ¿Cambiar los símbolos @ por la letra 'a'?, bueno al final todo dependerá de los requerimientos en nuestros proyectos. Nos podría surgir la pregunta ¿Porqué no hacer esto directamente en el script SQL que trae los datos? ... Bueno Pentaho ya viene optimizado para realizar estas tareas, y utilizará los recursos del servidor en el que se ejecute, evitando ponerle una carga mayor al SGBD, además no siempre nuestro origen de información será una base de datos, los ominipresentes archivos planos y las hojas de excel, seguirán siendo pan de cada día en las empresas. Aunque tengamos en cuenta, los SGBD serán mas eficientes en otras tareas como ordenamientos y JOINS, así que como desarrolladores, podemos analizar, pobrar y elegir la mejor opción.
Esto fue todo por hoy ¡Buen día y bendiciones!