Explotemos la Tecnología

Crear dimensiones tiempo mediante Talend

1. Introducción

Cuando creamos un DataMart, nos encontraremos en la necesidad de crear una dimensión de Tiempo. Con la ayuda de Talend, esto es una tarea de lo más simple,  además nos servirá este tutorial para ver como crear rutinas en Talend.

En este tutorial vamos a usar como base de datos MySql, aunque se puede usar cualquier otra base de datos.

2. Pasos a seguir

Para poder crear la dimensión tiempo primero tendremos que crear la tabla tiempo con todos los campos necesarios y después ya desde Talend podemos empezar a modelizar.

2.1 Crear la tabla en la base de datos

La tabla que vamos a crear, tendrá la siguiente estructura:

  • Id: La clave primaria para la dimensión tiempo
  • Feha: Será la fecha con formato YYYY-MM-DD
  • DiaDelMes: Nos indica que día del mes es (1..31)
  • Mes: Se trata del número de mes (1..12)
  • Año: El año en cuatro dígitos
  • NombreDia: El nombre entero del día
  • NombreMes: El nombre entero del mes
  • EsDiaLaborable: Nos indica si es un dia laborable (1 o 0)
  • DiaSemana: Es el dia de la semana (1..7)
  • NumeroSemana: Se trata del número de semana (1..53)
  • Quarter: Número de quarter (1..4)
  • NombreQuarter: Nos indica el nombre del Quarter

A continuación mostramos la SQL usada en MySql, para otro gestor de Base de Datos posiblemente se tendrá que adaptar.


CREATE  TABLE `ssb`.`dim_time` (
`Id` INT NOT NULL,
`Fecha` DATE NULL,
`DiaDelMes` INT NULL,
`Mes` INT NULL,
`Ano` INT NULL,
`NombreDia` VARCHAR(25) NULL,
`NombreMes` VARCHAR(25) NULL,
`EsDiaLaborable` INT NULL,
`DiaSemana` INT NULL,
`NumeroSemana` INT NULL,
`Quarter` INT NULL,
`NombreQuarter` VARCHAR(12) NULL,
PRIMARY KEY (`Id`) );

2.2 Creación de la dimensión en Talend

2.2.1 Configurar la conexión

Una vez tenemos la tabla creada, ya podemos iniciar Talend. Los pasos necesarios son creamos una conexión nueva y seleccionamos la tabla de dimensión tiempo. Para crear una conexión, tal y como hemos visto ya en  otros tutoriales, sólo tenemos que ir al repositorio y escogemos Db Connections – New Connection y seguimos el asistente.

En la versión de MySql con la que trabajamos no admite valores booleanos, por lo que tendremos que modificar el esquema de forma que un boolean de Talend se corresponda a un Integer de MySql. Para esto sólo tenemos que abrir el esquema de la tabla y cambiar el tipo de variable, tal y como vemos en la imagen.

Edición esquema tabla

2.2.2 Crear el Job

Con el esquema creado, pasamos a crear el Job y arrastrar los componentes con los que vamos a trabajar. Vamos a necesitar:

  • tRowGenerator
  • tMap
  • tMySqlOutput (si usamos otra bd seleccionamos el componente correcto para la bd)

Cuando tengamos los componentes en el Job los unimos, de tRowGenerator a tMap y tMySqlOutput.

Diseño del Job

2.2.3 Crear rutinas en Talend

El siguiente paso es crear la rutina que vamos a usar para las transformaciones de las fechas. Para crear rutinas, en el repositorio tenemos la opción Code, la desplegamos y con el botón derecho damos a Create Routine, el asistente nos va a preguntar el nombre de la clase que deseamos crear (en Talend como lenguaje usamos Java). A continuación pego el código que vamos a usar:


package routines;

import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Convert {

/**
* dateFromDays: devuelve un calendario añadiendo días según parámetro desde 1970-01-01
*
* @param numDays numero de dias
* @return la fecha añadiendo dias desde 1970-01-01
*/
public static Date dateFromDays(Integer numDays){
Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 01, 0, 0, 0);
cal.add(Calendar.DATE, numDays-1);
return cal.getTime();
}

/**
* formatDateNum formatea una fecha a Int
* @param pattern patron a formatear
* @param date fecha a formatear
* @return el Int formateado
*
* Ejemplo: formatDate(“yyyy-MM-dd”, Date())
*/
public synchronized static Integer formatDateNum(String pattern, Date date) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
StringBuilder sb = new StringBuilder(sdf.format(date));
return Integer.parseInt(sb.toString());
}
}

El código es muy simple, el primer método nos genera objetos Date a partir del año 1970 y se incrementa en los días que pasemos por parámetro. En caso de que deseemos con un calendario diferente, cambiamos el año 1970 por nuestra fecha inicial. El segundo método nos transforma a Integer partes de la fecha. Es decir, nos devuelve que día del mes es, día del año…

2.2.4 El componente tRowGenerator

El tRowGenerator, nos sirve para crear secuencias o “registros”. En nuestro ejemplo nos servirá para crear tantos registros como necesitemos para la dimensión tiempo. Básicamente este componente genera valores desde un valor inicial a un valor final incrementándolo un valor n. La configuración del componente tiene que ser la que vemos en la imagen. Para acceder a ella, pulsamos dos veces sobre el componente.

Configuración del tRowGenerator

2.2.5 El componente tMap

Este componente es donde indicaremos como rellenar cada uno de los campos de la tabla de dimensión tiempo, su funcionamiento básico ya lo hemos visto en otros tutoriales. Los pasos básicos de configuración son los siguientes.

Indicamos el esquema para el tOutputMySql, pulsamos el botón settings y seleccionamos el esquema de la tabla que hemos creado en el repositorio.

Escoger esquema en tMap

Ahora necesitamos crear una serie de variables, las variables las creamos mediante el menú que tenemos en el centro de la pantalla de la edición del tMap. Cada vez que pulsamos la cruz del centro de la pantalla nos crea una nueva variable. Estas variables tienen un nombre, su tipo y su expresión o valor. Su expresión o valor, si es simple podemos escribirlo directamente, en caso de que sea complejo, Talend dispone de un asistente para crearla, mediante el botón con … que hay en el espacio expresión para cada variable. El asistente lo podemos ver en la imagen.

Editar expresión en tMap

Las variables que creamos, nos ayudarán mediante la clase que hemos creado a obtener los valores que deseamos para la dimensión tiempo. En la imagen se ve más claro.

Edición variables en tMap

Ahora sólo nos queda indicar como rellenar los campos para el tMySqlOutput dentro del tMap. Para eso usaremos la variables que hemos creado antes.

Edición tMap

  • Id: Si en la base de datos lo hubiéramos configurado como autonumérico, en ese caso, no necesitaríamos asignarle ningún valor, en caso contrario le asignamos directamente row1.num, donde row1 es el nombre de nuestro tRowGenerator.
  • Ano: Necesitamos usar el método formatDateNum de la clase Convert y como argumentos varDate (variable definida) y el patrón para obtener el año.
  • NombreDia: Con funciones propias de Talend podemos obtener  el nombre del día, como argumentos varDate y el patrón (EEEE).
  • NombreMes: Exactamente igual que el anterior, pero sólo cambia el patrón.
  • EsDiaLaborable: Para saber si es domingo o sábado tenemos que mirar si el día de la semana es 0 o 6
  • NombreQuarter: Deseamos obtener que Quarter es (QX). Mediante la variable varQ, que tiene la Q, lo concatenamos con la varQuarter que nos da el número de Quarter.

Vista del tMap

3. Conclusiones

En este tutorial hemos aprendido como crear una dimensión tiempo mediante Talend. Para ello hemos creado dentro de Talend una clase en Java y hemos aprendido a usar el componente tRowGenerator. La dimensión tiempo que hemos creado, es simple, pero no sería costoso hacer una más compleja según las necesidades del proyecto.