Tutorial Talend Open Studio. # 7 Componentes De Transformación De Datos
Componentes de generación de datos para probar desarrollos.
tRowGenerator: Generar datos automáticamente
Para desarrollar los procesos, es muy útil disponer de ciertos datos para hacer pruebas de laboratorio en un entorno controlado, para esa tarea Talend nos ofrece unos componentes para generar datos de manera automática y aleatoria del numero de registros que nos hagan falta, desde nombre de personas, correos electrónicos ciudades, cadenas de textos, números, etc…
También mediante la opción parameters podemos limitar la longitud de los campos generados. Por ejemplo. «Length_>6»
tFixedFlowImput: Generar datos manualmente
Este componente permite generar una tabla de datos en la que podemos introducir datos de manera manual.
Lo primero es con el botón «Edit Schema» es generar el esquema que necesitemos para nuestra tabla de datos.
Y luego la forma más cómoda de introducir datos es usar la opción «Use Inline table» para ir introduciendo lo datos por columnas.
Componentes de separación y generación de múltiples flujos de datos
Hasta ahora en publicaciones anteriores, únicamente hemos visto jobs que trabajan con un único flujo de datos. Pero es posible separar un flujo en múltiples datos así como juntar diferentes flujos en uno único.
Componentes de filtro y separación de flujos
tFilterRow: Filtro de datos
Este componente nos permite filtrar unos datos a partir de una o varias condiciones en las que podemos seleccionar el tipo de condición AND/OR. Este componente nos ofrece dos flujos de salida:
- El flujo de salida «Filter», es decir, el flujo que contiene los datos que cumplen la condición.
- El flujo de salida»Reject», el flujo rechazado que no cumple la condición
El ejemplo de la imagen, se muestra la configuración del filtro del componente y los dos tipos de flujo de salida del componente tFilterRow.
tSchemaComplianceCheck: Comprobación de los registros que cumplen el esquema que queremos utilizar.
Este componente es el más usado para «data quality». Es muy útil porque algunas veces nos encontramos en errores en el proceso debido a que determinados registros no cumplen el «data type» del esquema. Con este componente podemos detectar y separar los registros que no cumplen el esquema para solucionar la incidencia.
Este componente es de hecho un filtro pero con un criterio especial de filtro que es cumplir el esquema que indicamos.
El componente lo podemos configurar para este fin de dos maneras:
- Custom defined: Cuando manualmente indicamos las columnas y datatype que queremos analizar.
- Use another schema for compliance check: En esta opción podemos copiar el esquema actual y hacer los cambios que necesitamos y hacer pasar un check por todo el esquema, pero teniendo en cuenta que hay que mantener el mismo orden de los campos.
El subjob de la imagen muestra un ejemplo en el que vemos que el componente tiene dos salidas: La salida main con los registros correctos que cumplen el esquema y un flujo de rejects con los registros que no cumplen el esquema.
En el ejemplo creamos manualmente una tabla con una sola columna de tipo string y introducimos los siguientes registros:
«1»,»dos»,»3″,»4″ y le indicamos en la configuración del componente que la columna es de tipo «integer». En el flujo main nos desviará los registros que pude convertir a int, es decir 1,3,4 y en el flujo de rechazo el segundo registro con valor «dos» debido a que es un string que no puede convertir en número entero (Integer).
tReplicate: Replicar el flujo.
Este componente es utilizado cuando por motivo de proceso necesitamos que el flujo se replique, por ejemplo para hacer una misma salida de datos a una tabla de una base de datos y también a un fichero. O por ejemplo si necesitamos dos flujos, uno con todos sus registros para hacer una salida y la suma o valores agregados con la finalidad de realizar comprobaciones, etc…
Componentes de Unión de flujos
tUnite: Unir dos flujos
Este componente hace lo contrario al tReplicate, ya que une dos flujos de datos que tengan un mismo esquema, pero con alguna restricción, ya que no podemos unir un flujo que haya sido separado en el mismo subjob.
No combina registros, sino que simplemente junta un flujo de datos debajo del otro, tipo UNION de SQL.
tJoin: Join de flujos.
Lo cierto es que después de la potencia y optimización de proceso y otras capacidades que nos permite el componente tMap, tJoin queda bastante canivalizado por el todo poderoso componente tMap y su uso es menor.
Para configurar el componente primero debemos indicar cual es el flujo de principal. (Por ejemplo el que trae el flujo de ventas que trae las claves foráneas de cliente y de producto). Por otra parte hay que identificar el flujo de lookup (que puede ser por ejemplo la tabla de clientes y productos cuyas claves primarias se unen a las foráneas del flujo principal, para mostrar el nombre de clientes y de los productos que no aparecen en la tabla ventas).
Luego en la pestaña de configuración del componente tJoin, únicamente debemos indicar las claves de unión de los dos flujos, sea única de un campo o doble o de más de un campo. Así como los campos de la tabla de lookup que queremos mantener en el flujo de salida. Hay que tener en cuenta que los campos del flujo main se mantienen todos, dado que no es modificable su incorporación.
tMap: Un comodín que une con join, filtra y genera expresiones
Es una joya de Talend, la verdad es que de manera muy intuitiva conecta cualquier número de flujos de entrada y genera cualquier número de flujos de salida. El tMap, tiene un asistente gráfico que permite una configuración muy sencilla.
Como en el caso anterior del tJoin lo primero de todo es identificar que flujo es el principal. El flujo principal o main, que se nos muestra en el job con línea continua, ha de ser la tabla de hechos o con las medidas o métricas además de incorporar alguna clave que nos permita conectar con alguna de las otras tablas que vienen de los flujos de lookup. Los Flujos de lookup se conectaran al componente de tMap con flujo discontínuo.
Una vez conectados los flujos, configuramos el componente. En los paneles de la izquierda de la pantalla de configuración de tMap, encontramos los imputs de datos sobre estos imputs debemos relacionar las claves. Estas relaciones las establecemos simplemente «drag and drop», es decir arrastrando el campo de la clave foránea del flujo main a la clave primaria de un flujo de lookup, tras lo cual observamos que los campos relacionados de cada tabla quedaran conectados mediante una línea de un color violeta. También nos aparecerán unas llaves sobre los campos clave de las tablas de lookup de color azul que indican la relación definida en esas claves.
Con el botón de configuración, representado por la llave inglesa, en cada flujo imput, podemos configurar el tipo de unión de cada flujo con el flujo main, puede ser de tipo «left outer», o «inner» es decir en «inner» no se incorporan los registros no coincidentes y el el «left outer» se mantienen todos los registros con clave de unión «null».
Después de crear las relaciones, ya podemos generar las tablas de salida de datos, que podemos generar los que necesitemos, creando los mismos con el «+» de la parte superior del panel derecho. Así nos devuelve este componente de 1 a n salidas «output».
Los campos de cada flujo de salida los podemos arrastrar de los flujos de origen, vemos que se nos generan unas líneas de relación entre los campos de los flujos de entrada y salida. Si seleccionamos un flujo, estas relaciones las vemos en amarillo y el campo de la tabla de origen lo vemos de color verde y si no está seleccionado la relación la vemos de color gris.
Pero eso no es todo también podemos filtrar los datos y esto lo podemos hacer mediante el segundo botón de flecha y +. Una vez le damos al botón se nos abre un espacio para introducir la condición que la podemos escribir de manera asistida abriendo el editor pulsando el botón de la derecha de los tres puntos. Una vez introducida la condición (en el ejemplo filtramos la «zona_1») vemos que se nos establece una relación de color naranja con los campos implicados en la condición.
Importante indicar que en la condición de la expresión del tMap: Si el campo es numérico usaríamos el operador «==», es decir, por ejemplo row2.zona==1. Pero si es string utilizaremos la función equals, es decir row2.zona.equals(«Zona_1»), tal como muestra la imagen anterior. También podemos crear una nueva salida de los registros rechazados con la expresión anterior creando otra salida de output, con el mismo esquema de columnas y en el botón de configuración del output de la llave inglesa marcar «Catch output reject -> True». De forma similar también podemos obtener registros rechazados por el tipo de unión inner indicando de igual manera»Catch lookup inner join reject->»
Pero aquí no se acaba la cosa, no señor… desde el tMap podemos hacer más cosas, como por ejemplo generar nuevos campos con expresiones.
¿Cómo generar campos con expresiones en tMap? Pues lo primero que necesitamos es generar en el esquema de salida nuevos campos mediante la tecla «+» y configurar el tipo de datos que precisamos.
Podemos como ejemplo generar 3 campos nuevos que nos puden ser útiles:
- Una columna con un valor fijo constante
- Una fórmula que nos calcule el precio medio (Ventas / Unidades)
- Una tercera columna de time stamp, que nos marque la fecha y hora de creación del registro
- Otra columna de clave primaria del flujo de salida, es decir una columna con la secuencia numérica que podamos utilizar como clave primaria de una tabla de datos
Una vez creados los 3 nuevos campos en el esquema ya podemos generat la expresión, que en nuestro caso será con la ayuda del botón de los 3 puntos que nos abre el asistente de expresiones.
La primera columna es muy sencilla de crear pues simplemente debemos indicar el valor de la constante incorporamos en el campo (en el ejemplo una constante de valor int 1).
La segunda si utilizamos el asistente es muy sencillo, arrastramos o doble clic en los cuadros de los campos que necesitamos en nuestra expresión al cuadro de expresiones utilizando los botones de las operaciones que necesitemos:
Arrastramos el campo row1.ventas, pulsamos el botón del operador división / y arrastramos el campo row1.unidades, quedando la expresión como en la imagen siguiente
Para la tercera columna de crear una columna que nos indique el sello de tiempo utilizaremos las funciones que nos ofrece el asistente. Buscamos en la categoría de funciones TalendDate y elegimos la función getDate. Al seleccionar nos aparece en la pantalla de expresión la función con un patrón de fecha-hora.
De igual manera actuamos para obtener la columna con la secuencia numérica. Seleccionamos la categoría «Numeric» y seleccionamos la función «Sequence». «S1» es el contador de la numeración, si queremos tener más de un contador que no siga la misma numeración tenemos que crear otro contador, por ejemplo «S2»
Podemos utilizar así una gran variedad de funciones predefinidas para generar expresiones que podemos incorporar en campos de salida.
Pero la potencia del tMap no acaba ahí podemos aún hacer más cosas, como por ejemplo crear y utilizar variables globales que podemos utilizar tanto dentro como fuera del componente tMap,
¿Cómo crear y asignar variables a campos mediante tMap?
En el cuerpo central de configuración del tMap es donde podemos crear expresiones que podemos guardar en variables para ser utilizadas en expresiones de campos generados de los outputs o incluso creando directamente nuevos campos arrastrando la variable al output. En el ejemplo siguiente, creamos una variable llamada Var1 mediante una expresión que concatenamos dos campos de dos imputs de datos mediante el + y le añadimos un espacio » » entre medio de los campos.
Componentes para «data quality».
Este grupo de componentes, se utilizan para transformar los datos para cumplir los requisitos de un esquema. Estos componentes están muy relacionados con el componente que vimos en el grupo de fitros que era el tSchemaComplianceCheck que nos separaba en un flujo diferente al principal aquellos registros que incumplían los requisitos del esquema.
En el ejemplo que se utilizó, separaba el registro «dos» debido que es un dato de cadena de texto » string» que no cumplía el ser un número entero «integer».
Lo que podemos hacer es cambiar el registro con «dos» por otro con «2». Esto lo podemos hacer con el componente tReplace.
El componente tReplace permite buscar una cadena de texto y substituirla por otra. Le podemos indicar si substituye toda la palabra si es «case sensitive» es decir si discrimina o no Mayúscula/minúscula. También tenemos la opción en Advanced mode en utilizar expresiones regulares.
En el ejemplo le indicamos que busque «dos» y lo substituya por «2», con lo que una vez sustituido, tenemos ya todos los datos numéricos que podemos convertir de string a int. Esta conversión la podemos hacer con el componente tConvertType.
El componente tConvertType nos permite establecer un esquema y mediante la opción «Autocast» convertir los tipos de origen al «datatype» establecido en el esquema. También si no queremos convertir todo el esquema, podemos hacerlo manualmente de algunas columnas mediante la opción «Manual Cast».
El ejemplo muestra como el componente de tSchemaComplianceCheck rechaza los registros que no cumplen. El componente tReplace substituye los valores para que cumpla («dos» por «2». Por último el componente tConvertType, cambia el datatype (En el ejemplo de «string» a «integer».)
El componente tFilterColumns, nos ayuda a eliminar las columnas del esquema que no sean necesarias, simplemente modificando el esquema.
Otros componentes de transformación
Componente tAggregate: Nos permite agregar registros a partir de uno o varios campos y unas funciones de agregación de forma idéntica al «group by» SQL. En la parte superior indicamos los campos que queremos agregar y en la inferior los campos con las funciones de agregación.
Antoni Lisbona: Director de BuConDa
Volver índice contenidos tutorial