|

miércoles, 26 de junio de 2013

Operaciones sobre cadenas en KETTLE

Pick a letter...

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!
Enhanced by Zemanta

9 comentarios:

  1. Excelente entrada. Bueno el conjunto de todos estos post, muy bueno, puntual y útil. Gracias por compartir.

    ResponderEliminar
    Respuestas
    1. Gracias por tu comentario, esa es la idea de este Blog, tratar de responder preguntas que nos surgen en el aprendizaje de esta herramienta, cuya documentación en español todavía es escasa.

      Eliminar
  2. Buenos Días. Excelente explicación, es sencilla y clara.
    Tengo de todos modos la siguiente inquietud. Como puedo obtener la longitud de una cadena leida desde una base de datos.

    Necesito leer un campo string llamado cdgo_fscal que contiene códigos, pero estos códigos vienen de 1 caracter o dos caracteres.
    Si es de un caracter la idea es poner dos ceros por delante, ejemplo si es 4 hay que poner 004 y si es por ejemplo 56 solo poner un cero por delante así 056.

    El problema es que no consigo obtener la longitud del dato para poder adicionar el dato cero que necesito poner.

    Mi script javascript es el siguiente pero no funciona la validación del if:
    var t = cdgo_fscal.getString();

    if(cdgo_fscal.getStringLength() == 1){
    t = t.setValue("00") + t;
    }

    if(cdgo_fscal.getStringLength() == 2){
    t = t.setValue("0") + t;
    }

    Como estoy utilizando la versión 4.2.1 de Kettle, me pregunto si esta funcionalidad no aplica en esta versión...?

    ResponderEliminar
  3. ¡Excelente artículo!

    Ahora bien, ¿se puede usar condiciones para el "replace with"? Quiero hacer esto:

    Tengo un XLS con un campo de fecha con este formato: "01-Jan-15". Si quiero pasar esto al formato "01-01-15", sustituiría "Jan" por "01", ¿pero cómo hago si en el mismo campo pueden aparecer los demás meses (Feb, Mar, Apr, May, Jun, etc.) y los quiero sustituir por los números correspondientes (02, 03, 04, 05, 06, etc.)? ¿Es posible usar alguna condición para que, dependiendo del mes, así sea el número que se coloque reemplazándolo?

    ¡Gracias!

    ResponderEliminar
  4. Hola, soy bastante nuevo en la herramienta Kettle, mi pregunta es, ¿ como podría realizar un replace String cuando mi cadena de entrada puede ser variable?

    ResponderEliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Buenas Tardes, que lastima que el ejemplo ya no se encuentre disponible en la descarga y algunas imagenes ya no estan, sin embargo muy bien explicado

    ResponderEliminar
  7. Hola,

    Primero felicitarte porque tu post me ha sacado de varios apuros.

    Por otro lado, solicito de su ayuda con el siguiente tema:

    Necesito convertir un campo de tipo String a Numerico (longitud 19 y decimales 15).
    Ejemplo de Número decimal:
    12.760000000000000

    Al convertirlo a Número en el step Calculadora el resultado fue este:
    12.760000000000034

    Qué steps formato debería colocar para hacer el redondeo de la cifra decimal?

    Saludos!

    ResponderEliminar
  8. si quisiera reemplazar á=a é=e i=i etc...
    de un string como debe ser? de ante manos muchas gracias

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...