jueves, 23 de febrero de 2017

Generar filas de datos con SSIS

En la empresa donde trabajo ahora, lo tienen todo montado sobre SQLServer, no es mi gestor de bases de datos preferido, pero poco a poco lo voy conociendo y dicen que el roce hace el cariño. No se si llegaremos a ese extremo, pero de momento no nos hemos perdido el respeto.
La cosa es que me han encargado desarrollar unos reports y cubos y le estoy dando vueltas a las herramientas de BI que acompañan al producto.
Una de las dimensiones que se han de manejar es la típica tabla de pares código-valor que no cambian nunca, o en el peor de los casos se le añade algún registro una vez cada mucho. En concreto eran tipos de envío y solo había cuatro tipos. Hasta ahora no habían estado registradas en ninguna tabla, el programa de gestión las generaba por código en base a ciertas características del envío, pero para mi desarrollo necesitaba tenerlas en una tabla.
Lo más fácil hubiese sido meterlas a pelo en la tabla y olvidarme del tema, pero se me metió en la cabeza hacerlo con SSIS, para saber como hacerlo.
En los orígenes de flujo de datos, no hay ninguna manera de generar filas a pedal (otros ETLs si tienen esta opción), así que buscando encontré el "Componente de script".
Cuando arrastramos el componente a la tarea (o hacemos doble click sobre el), se nos abre una pantalla donde podemos especificar como se utilizará el script: como origen de datos, como destino de datos o para transformarlos.


La opción que nos interesa es "Origen", que nos permitirá generar filas de datos.
A continuación hacemos doble click en el componente, para abrir el editor. En la lista de la izquierda podemos elegir los diferentes aspectos del script que podemos configurar. En nuestro caso nos interesan la primera y la segunda. En la opción "Script", básicamente podemos modificar tres valores: el nombre del componente, la descripción y el lenguaje que utilizaremos para escribir el script, en nuestro caso lo haremos en C#.
La opción "Entradas y salidas", la utilizaremos para agregar las columnas que queremos generar: nombre y tipo de datos.


Volvemos a la opción "Script" y presionamos "Editar script..." para abrir el editor.


Los metodos PreExecute() y PostExecute() no nos interesan, los podemos borrar tal como indica el comentario. El que nos interesa es CreateNewOutputRows().
Aquí, para el objeto Salida0, que es el nombre de nuestra salida, invocamos el método AddRow() que nos crea una nueva fila y asignamos los valores que nos interese a las columnas que habíamos definido anteriormente. Podemos repetir el código para generar más filas, montar un bucle o complicarlo tanto como necesitemos.

Y eso es todo, nuestro flujo ahora tiene una fila con dos columnas que contienen los valores 1 y "Valor1".

martes, 21 de febrero de 2017

Compartir conexión en PDI

Pentaho Data Integration (a.k.a. PDI, a.k.a. Kettle), es una herramienta de ETL que cumple la regla de las tres bes: buena, bonita y barata. La utilizo continuamente en mi trabajo para leer, depurar, modificar, cruzar, seleccionar y escribir datos en una gran variedad de formatos de fichero y bases de datos.
Hace unos días descargué e instalé la versión 7, pero de momento sigo manteniendo la versión 5 hasta que esté seguro de que no me dará problemas. De momento ya he encontrado un problemilla, menor pero un poco molesto: el IDE en castellano no reconoce los acentos y demás caracteres propios del idioma. Me aparece un interrogante dentro de un rombo �
Trasteando para intentar solucionar este problema, vi algo en lo que no me había fijado nunca: Kettle permite compartir conexiones a bases de datos entre diferentes jobs y transformations!!
Os aseguro que llevo muchos años utilizándolo, he desarrollado cientos (¿miles?) de transformaciones, la inmensa mayoría con conexión a la misma base de datos y en todas ellas he creado la conexión cada vez. Y hoy me encuentro que podía haberla creado una sola vez y haberla utilizado en todas :(
¿Y eso como se hace?
Fácil, primero creas la conexión (entiendo que si te interesa compartirla, es porque ya la tienes creada, si no sabes como hacerlo, me dejas un comentario y un día hago una entrada explicándolo). Una vez creada, vas a la pestaña View, buscas tu conexión y en el menú contextual (botón de la derecha del mouse), seleccionas 'Compartir':

A partir de ahora, todas las transformaciones que crees tendrán todas tus conexiones compartidas incorporadas. ¡Un verdadero ahorro de trabajo!

¿Y cuando quieres dejar de compartirla? Ahora aparece una nueva opción en el menú contextual.



¿Vuelvo a la carga? Venga, lo intento...

Ya no recordaba haber empezado este blog, la verdad es que soy un desastre. Voy a intentar retomarlo e ir añadiendo algunas ideas relacionadas con el mundo del BI, las bases de datos y la programación. A ver si esta vez soy constante.

Un saludo

domingo, 15 de febrero de 2009

Firebird vs mySQL

Lo primero que me planteé fue poder manejar los datos con una base de datos 'de verdad' y mis dos primeras opciones fueron sin ninguna duda para estos dos sistemas.
Firebird porque lo conozco desde que comenzó el proyecto a partir de la liberación de Interbase, me siento cómodo por su facilidad de instalación, de mantenimiento, por su robustez y fiabilidad, porque es rápida y conozco bastante el lenguaje de procedimientos que utiliza.
MySQL por su implantación universal, casi todos los sistemas open source relacionados con el bi, data cleasing y similares lo contemplan como la base de datos por defecto.
El primer problema con el que me encontré fue la imposibilidad de instalar nada en el PC donde trabajo, tenía que conseguir que funcionase sin instalación. Buscando encontré dos primeras soluciones: por la parte de firebird pensé en el servidor embebido como solución, pero pronto aparecieron los problemas: los ejecutables tienen que estar en la misma carpeta que la dll del servidor, o metía todos los ejecutables en la misma carpeta (que desorden) o copiaba la dll en mil y una carpetas; y lo más grave solo permite una conexión a la base de datos, imposible lanzar un proceso sobre una tabla y a la vez estar escribiendo un procedimiento, o cualquier otra combinación de tareas. Además no fui capaz de hacerlo funcionar con aplicaciones en java, vamos un desastre y deseché esta solución.
Para mySQL la solución fue Mowes , no me costó demasiado encontrar lo que buscaba, un servidor mySQL, un Apache con PHP y algunas utilidades en este entorno. Las primeras pruebas prometían, veloz, fácil conexión con todas las herramientas que estaba probando. Parecía que había encontrado lo que estaba buscando. Los problemas aparecieron con las primeras cargas completas, con más siete millones y medio de registros, las cosas empezaron a cambiar. Sin índices, las cargas eran rápidas, pero las consultas y procesos se eternizaban... con índices, eran las cargas las que se eternizaban, si cargaba sin índices y luego intentaba indexar, era aquí donde se eternizaba...¿mala configuración? ¿desconocimiento? Mala cosa, mi gozo en un pozo. Tenía que seguir buscando. Empecé a probar distintas soluciones: derby, H2, Hypersonic, pero ninguna cumplía con todo lo que yo quería.
A veces la solución la tenemos delante de las narices y la encontramos por casualidad, un día, navegando sin mucho rumbo, acabé en la zona de descarga de Firebird y me encontré con algo en lo que nunca me había fijado, firebird comprimido en zip para instalación manual... sin instaladores, solo copiando los ficheros en mi pen y arrancando el servidor desde allí con un simple "fbserver -a", ¿como no se me había ocurrido antes?

Mi pen y mi trabajo

El problema de trabajar en un organismo público sin pertenecer a el, rodeado de administrativos sin serlo, con un perfil técnico pero sin pertenecer al departamento de informática, es que permanentemente te encuentras en tierra de nadie, te piden (o incluso exigen) resultados pero como grandes herramientas te ofrecen el access y el excel. Y si propones alguna alternativa tienes que justificarlo por activa y por pasiva ante cuarenta carguillos intermedios, conseguir tropocientas firmas y vistosbuenos, y que los de informática tengan ganas de montarlo. Todo son problemas, si es una solución propietaria, seguro que es muy cara, si es libre, aparecerán dudas sobre la continuidad del soporte. Y tu sigues en medio, con ganas de hacer tu trabajo, pero sin ninguna de tener que enfrentarte con todo esto para poder hacerlo, y acabas tirando por el camino de enmedio, yo me lo guiso, yo me lo como.
Así es como tirando de pen y de aplicaciones libres y portables me he acabado montando una colección de herramientas relacionadas con las bases de datos, el bussines inteligence, el data cleasing y otras hierbas. Mi intención es compartirlas con el mundo, poco a poco.