Mostrando las entradas con la etiqueta kettle. Mostrar todas las entradas
Mostrando las entradas con la etiqueta kettle. Mostrar todas las entradas

jueves, marzo 28, 2013

Leer datos de XML y escribirlos en un archivo tabulado CSV con Kettle

Hola Gente,

tengo algo armado hace un tiempo y a raíz de alguna pregunta en redopenbi lo publico aquí.
Se trata de leer un archivo XML y convertirlo en un archivo plano separado por comas utilizando Pentaho Data Integration (PDI) o Kettle.

Introducción

PDI siempre tratará de convertir las fuentes de entrada en filas y columnas, con este principio hay que partir siempre que uno intente hacer algo con este software.

El XML en un tipo de datos jerárquico, por ello habrá que transformarlo a dato tabular. Para manipular XML se utiliza XQuery y XPath como para manipular datos relacionales utilizamos SQL, cualquiera que quiera trabajar con este tipo de datos debe interiorizarse con estos conceptos.


Objetivo

Nuestro objetivo es leer el archivo entrada.txt, obtener los datos que deseamos y escribirlos en un archivo tabular separado por comas llamado salidaCSVFromXML.txt



El archivo entrada.xml contiene:



<?xml version="1.0" encoding="UTF-8"?>
<raiz> 
  <dato id="1">dato 1 
    <otroDato atributo="ab">otro dato 1</otroDato> 
  </dato>  
  <dato id="2">dato 2 
    <otroDato atributo="abc">otro dato 2</otroDato> 
  </dato>  
  <dato id="3">dato 3 
    <otroDato atributo="abcd">otro dato 3</otroDato> 
  </dato>  
  <dato id="4">dato 4 
    <otroDato atributo="abcde">otro dato 4</otroDato> 
  </dato> 
</raiz>



El archivo salidaCSVFromXML.txt contendrá:


datoCol;idCol;otroDatoCol;atributoCol
dato 1; 1;otro dato 1;ab
dato 2; 2;otro dato 2;abc
dato 3; 3;otro dato 3;abcd
dato 4; 4;otro dato 4;abcde

El mapeo está claro y es:

Texto del nodo /raiz/dato a columna datoCol
Valor del atributo id del nodo /raiz/dato a columna idCol

Texto del nodo /raiz/dato/otroDato a columna otroDatoCol
Valor del atributo atributo del nodo /raiz/dato/otroDato a columna atributoCol


Manos a la obra

Abrimos Kettle utilizando el comando spoon.sh o spoon.bat según nuestro sistema operativo.
Creamos una nueva transformación y arrastramos al editor los pasos Entrada\"Obtener datos XML" y a la derecha Salida\"Salida Fichero de Texto", luego unimos ambos pasos y editamos la entrada XML haciendo doble click.

En la primera pestaña configuramos:



En la segunda pestaña debemos configurar cual será el nodo a ciclar, cada ciclo creará una nueva fila. En nuestro caso /raiz/nodo, en cada ciclo se asume que se trabaja a partir de este nodo. La cadena /raiz/nodo es una instrucción XPath.



Para darnos una idea de que implica esto, podemos utilizar uno de los tantos testers XPath online que existen, por ejemplo este http://www.mizar.dk/XPath/Default.aspx

Si colocamos:


Y presionamos el botón "Test XPath", obtenemos el resultado con los nodos seleccionados por la expresión XPath en color:


Recomiendo utilizar estas herramientas siempre que haya que evaluar expresiones XPath.

Volvamos a Kettle y configuremos la pestaña "Campos" de la siguiente manera:


Notemos que lo que colocamos en la columna XPath es relativo a lo que definimos en la pestaña  anterior, por ejemplo la tercera fila que define la columna otroDatoCol, tiene la expresión XPath otroDato/text(), pero la expresión completa es /raiz/dato/otroDato/text(), podemos ver la salida en el tester online con esta expresión completa:



Ahora podemos presionar el botón "Previsualizar filas" en Kettle y obtendremos:


Ahora cerramos el editor del paso presionando el botón "OK" y editamos el paso de salida de texto haciendo doble clic en el, en la primera pestaña configuramos lo siguiente:


Luego en la pestaña "Campos" presionamos el botón "Traer Campos" y quedará como sigue:



Cerramos este paso presionando el botón "OK" y listo, ya lo podemos ejecutar.

He subido a mi repo de github la trasnformación y el archivo de entrada de ejemplo: https://github.com/magm3333/material-osbi/tree/master/XML2CSV

Espero les sea de utilidad

Saludos

Mariano

jueves, enero 31, 2013

Federación de datos con PDI 5

Hola Gente,

por estos días han presentado las nuevas características de Pentaho Data Integration 5 (PDI o Kettle), son realmente muchas y por demás interesantes, aquí tienen la presentación del webex pasado, lamentablemente tuve que ver la versión offline ya que estaba de vacaciones.
Dentro de las nuevas características se encuentra una muy esperada, al menos por mí, se trata de la posibilidad de federar datos utilizando PDI.

Que es la federación de datos?
Bien, sin entrar en consideraciones técnicas diremos que la federación de datos es la posibilidad de vincular datos de orígenes heterogéneos (en esto PDI es excepcional!!!) y poder accederlos desde un único punto.

Ahora bien, PDI permite acceder prácticamente a lo que queramos, ahora bien, como accedemos luego?, bien lo haremos mediante el driver JDBC para Kettle, si si si, dije bien, ya disponemos de un driver JDBC para Kettle llamado (Thin Kettle JDBC driver).

No ahondaré mucho en teoría, aquí hay un link para profundizar, lo que si haré es desarrollar un ejemplo exponiendo el resultado de una transformación como servicio y luego consumiéndolo desde una clase java, ejemplo que aun no he visto en la web.

Comencemos diciendo que hace falta la versión 5 de PDI que aún está en desarrollo y la pueden descargar desde aquí.

Todo el material que explico lo pueden descargar desde aquí.

Creando la transformación.
Una vez que nos encontramos en la UI de PDI (spoon) creamos una transformación y la guardamos con el nombre listaPersonasDS.ktr, en mi caso la he almacenado en: /home/mariano/Documentos/material-osbi/pdi-Dataservices/listaPersonasDS.ktr, llamemos a esta localización TRANSF_HOME.

La transformación se verá finalmente como se muestra en la siguiente figura:

Es muy sencillo lo que esta transformación realiza solo une una tabla con datos de personas con una tabla con datos de canciones para conocer que canción le gusta a cada persona. Si bien el ejemplo es muy sencillo remarco que estamos accediendo a datos de orígenes diversos y herterogeneos, en algunos casos muy complejos de configurar y mantener, pero como ya he dicho antes "a esto se dedica don Kettle".

El paso (1) genera una tabla inline mediante el paso "Data Grid" con datos sobre personas, los datos son:

La metadata es:

El Paso (2) obtiene la lista de las canciones de un archivo txt mediante el paso "Input Text File", este archivo se encuentra en la web en la dirección: https://raw.github.com/magm3333/material-osbi/master/pdi-Dataservices/listaCanciones.txt. Las canciones serán vinculadas a las personas mediante su clave (idCancion).


Los pasos (3) y (4) solo ordenan los datos por idCancion ya que el paso (5) así lo requiere.

Por último, el paso "salida" selecciona las columnas que serán el resultado final, se puede notar que este paso tiene un pequeño icono arriba a la derecha:


Este icono significa que este paso se está utilizando como paso de servicio, en otras palabras, desde este paso se expondrán los datos como servicio. Para realizar esta configuración presionamos Ctrl+T para acceder a las propiedades de la transformación, luego en la pestaña "Data Service" indicamos los datos del servicio como lo podemos ver en la siguiente figura:


Es necesario dar un nombre al servicio, en este caso "listaPersonas" y seleccionar el paso del cual se obtendrás los datos de salida que serán expuestos. También tenemos la posibilidad de hacer caching de datos, solo recomendado para servicios cuyos datos no cambian.

Bien, eso es todo en cuanto a la transformación.

Configurando Carte:

Es mediante el servidor web Carte que se prestará el servicio.
Carte permite realizar muchas tareas y expone los comandos mediante servicios web RESTfull.

Podemos realizar configuraciones personalizadas a Carte de forma muy sencilla, vamos a configurar nuestro servicio de datos federado de esta forma. Solo debemos crear un archivo XML, en mi caso:
/home/mariano/Documentos/material-osbi/pdi-Dataservices/configuracionCarte.xml, llamemos a esta ruta CARTECONFIG_HOME.

El contenido del archivo es:

 

<slave_config>  
  <slaveserver>    
    <name>slave1</name>    
    <hostname>localhost</hostname>    
    <port>8088</port>    
  </slaveserver>  
  <services>  
    <service>    
      <name>listaPersonas</name>     
      <filename>[TRANSF_HOME]</filename>     
      <service_step>salida</service_step>   
    </service>
  </services>
</slave_config>


Como podemos ver es más que sencilla la configuración, solo debemos recordar bien el puerto y colocar correctamente el valor de [TRANSF_HOME], en mi caso:
<filename>/home/mariano/Documentos/material-osbi/pdi-Dataservices/listaPersonasDS.ktr</filename>  

Ejecutando Carte con la configuración personalizada:

Una ves que guardamos el archivo de configuración, abrimos un interprete de comandos de nuestro sistema operativo, nos posicionamos en la carpeta HOME de PDI y ejecutamos:

Linux o Mac OS:

sh carte.sh [CARTECONFIG_HOME]

Window$:

carte.bat [CARTECONFIG_HOME]

Podemos verificar el estado del servicio colocando en nuestro browser: http://localhost:8088/kettle/status/, deberíamos ver algo así:


 La clase java:

La clase java es muy sencilla y la muestro a continuación.



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class TestPDIDS {
public static void main(String[] args) throws Exception {

Class.forName("org.pentaho.di.core.jdbc.ThinDriver");

Connection cn = DriverManager.getConnection(
"jdbc:pdi://localhost:8088/kettle", 
"cluster", "cluster");

String sql = "SELECT nombre,so,cancion "+
"FROM listaPersonas "+
"WHERE edad<50 ORDER BY edad";
ResultSet rs = cn.createStatement().executeQuery(sql);
System.out.println("Nombre\t\tSO\tCanción");
System.out.println("------\t\t--\t-------");
while (rs.next()) {
String nombre = rs.getString(1);
if (nombre.length() > 7)
nombre += "\t";
else
nombre += "\t\t";
System.out.println(nombre + rs.getString(2) + 
"\t" + rs.getString(3));
}
}

}

Como se puede apreciar es un programa que utiliza JDBC de forma estándar y sin sorpresas. Lo único a tener en cuenta es que la implementación de Driver es: org.pentaho.di.core.jdbc.ThinDriver y la URL tiene la forma: jdbc:pdi://localhost:8088/kettle luego el usuario y contraseña son: clutser/cluster.
Respecto al soporte SQL, puede verse la información en la wiki de pentaho: http://wiki.pentaho.com/display/EAI/The+Thin+Kettle+JDBC+driver


La salida luego de la ejecución de esta clase es:


Nombre SO Canción
------ -- -------
Sebastian Linux fusilados por la cruz roja
Catalina Linux toxi-taxi
Rodrigo Linux mi perro dinamita
Damian Window$ toxi-taxi
Dario Linux blues de la artilleria
Federico Linux musica para pastillas
Juan Linux un poco de amor frances
Emanuel Window$ fusilados por la cruz roja
Andrea Linux un poco de amor frances
Mariano Linux mi perro dinamita


Las librerías que necesité para que esta clase se ejecute correctamente son:


[PDI_HOME]/lib/kettle-core-TRUNK-SNAPSHOT.jar
[PDI_HOME]/lib/commons-vfs-20091118-pentaho.jar
[PDI_HOME]/lib/log4j-1.2.16.jar
[PDI_HOME]/lib/commons-logging-1.1.1.jar
[PDI_HOME]/lib/kettle-db-TRUNK-SNAPSHOT.jar
[PDI_HOME]/lib/kettle-engine-TRUNK-SNAPSHOT.jar
[PDI_HOME]/lib/commons-httpclient-3.1.jar
[PDI_HOME]/lib/commons-lang-2.6.jar
[PDI_HOME]/lib/commons-codec-1.5.jar



Si chequeamos el status nuevamente, aparecen las ejecuciones de nuestras consultas:


Luego podemos hacer click en cualquier consulta y nos mostrará detalles de la ejecución de la transformación:



Sin duda que pueden hacer uso de este driver desde otras tecnologías como: Pentaho Report Designer, BIRT, Jaspper Reports. Pentaho Schema Workbench, etc, pero queda fuera del alcance de este post.

Conclusión:

Que decir de esto que no se vea a simple vista, solo que es una característica nueva muy potente que otorga más flexibilidad al ya increíble PDI. Seguramente con el transcurrir del tiempo irá mejorando y creciendo, sobre todo dando más soporte a SQL.

Espero que les sea de utilidad

Saludos

Mariano


Etiquetas

pentaho (45) java (35) eclipse (23) jdbc (14) curso (13) tomcat (13) primefaces (12) db2 (11) mondrian (10) review (10) jsf (9) openI (9) pdi (9) prd (9) libro (8) plugin (8) musql (7) struts (7) javascript (6) spring (6) cdf (5) ctools (5) instalar (5) linux (5) mysql (5) data studio (4) hibernate (4) ireport (4) jasper (4) meteor (4) videocurso (4) eglu (3) eglubi (3) elearning (3) graphite (3) grupo eglu (3) jboos tools (3) mexico (3) openbits (3) packt (3) python (3) undec (3) websphere (3) applet (2) cde (2) dao (2) db2university (2) exelearning (2) flexigrid (2) hadoop (2) iua (2) kettle (2) moodle (2) node (2) olap (2) osbi (2) pivot4j (2) scorm (2) sql (2) stpivot (2) actionscript (1) amazon (1) autenticacion (1) avanzado (1) base de datos (1) big data (1) bigdata (1) bodoc (1) cambiar (1) ccc (1) cdc (1) chat (1) cloud (1) coffeescript (1) control de acceso (1) corti (1) csv (1) cuba (1) curso meteor undec (1) dashboard (1) datamart (1) dataptix.tv (1) datasource (1) datatable (1) db2 ExpressC (1) demonio (1) distancia (1) driver (1) driver jdbc (1) eglufiltertwolist (1) encapsulamiento (1) especialización (1) etl (1) excepciones (1) export (1) faces (1) federación (1) filas afectadas (1) filtertwolist (1) filtrado (1) flegrid (1) flex (1) google (1) google viz (1) hostname (1) html (1) i18n (1) ibm (1) identidad (1) indignación (1) instancias (1) inteligencia de negocios (1) jee (1) jpivot (1) l10n (1) la azada (1) la zaga de los confines (1) layout (1) liberado (1) libre (1) libro promoción (1) lob (1) marktplace (1) menu (1) meteor node javascript google oauth autenticacion (1) mobile (1) mongoDB (1) node.js (1) oauth (1) olap4j (1) open source (1) orm (1) persistencia (1) personalizada (1) prd5 (1) psw (1) publicidad (1) rad6 (1) recursividad (1) reporting (1) rock (1) saiku (1) script (1) servicio (1) sessiontimeout (1) sourceforge (1) spinneta (1) sqlserver (1) ssl (1) taller (1) troyanx (1) ubuntu (1) ucc (1) ui (1) web (1) web console (1) xampp (1) xml (1) xpath (1)

Seguidores