viernes, 15 de octubre de 2021

ETL, ELT y Data Virtualization

ETL es un término con los siglas de las palabras en inglés Extract, Transform and Load.
ETL, como su nombre sugiere, se utiliza para categorizar a aquellos procesos que extraen información de alguna  fuente, la transforman y la depositan en un destino final para su uso posterior.
Estos procesos son cotidianos en todas las empresas, ya que siempre hay necesidad de hacer modificaciones a alguna información para depositarla en algún repositorio, por lo general un Data Warehouse.

Con el advenimiento y popularizacion del Big Data y la información en la Nube (Cloud), se hizo necesario utilizar otro tipo de proceso, similar al anterior, denominado ELT : Extract, Load and Transform.
En este caso la información se extrae de una fuente, se carga en la Nube y luego se transforma para hacerla disponible.
Este cambio en los subprocesos Load/Transform se debe a que cuando estamos trabajando con Big Data necesitamos utilizar herramientas adecuadas para un volumen muy grande de información, y estas herramientas, en general, solo están disponibles en la Nube.

Relativamente hace poco tambien está disponible otro tipo de proceso que no requiere "mover/copiar" la información: Data Virtualization, denominada también Virtual ETL. De forma breve y sencilla, la virtualización consiste en crear "vistas" a la información en sus fuentes originales sin necesidad de copiarla o moverla. Estas vistas pueden ser de información alojada en la Nube o en servidores locales (on premise).
Hay quien dice que no se puede comparar Data Virtualization con ETL/ELT, lo cual en cierta manera es correcto, sin embargo hay situaciones en las que la virtualización de datos puede utilizarse en lugar de ETL/ELT

En el caso de ETL/ELT hay disponibles una gran cantidad de herramientas  ( muchas de ellas open source ), como Pentahoo, Talend, Informatica, Nifi, Data Factory de Azure, Glue de AWS,etc.
En el caso de Data Virtualization tenemos: Denodo, Tibco, etc

Además de las herramientas  antes mencionadas, también existen librerías/módulos para diferentes lenguajes como python, java, julia, etc.
En el caso de python, un módulo ligero y con muchas funcionalidades es petl

Voy a presentar un proyecto ETL muy sencillo utilizando el módulo petl de python.

El objetivo es cargar en un tabla de un base de datos MySQL el resumen de ventas de una empresa a partir de información disponible en varios archivos csv y xlsx.
Para ello vamos a utilizar SQLite como puente para las fases Extract y Transform del proceso ETL.

A continuación el script en python:

En la siguiente imagen podemos ver la estructura de la BBDD SQLite que se crea:

En la siguiente imagen podemos ver el resultado de una consulta a la tabla creada en MySQL:


 

viernes, 3 de septiembre de 2021

MongoDB y API de Amadeus (2)

En la entrada anterior vimos un ejemplo de como enlazar la API de Amadeus con MongoDB.

En esta entrada presento un sencillo programa en python-tkinter que permite buscar vuelos en Amadeus estableciendo varios parámetros, guardar la información en una colección de MongoDB y luego hacer consultas a esta colección.

El programa dispone de tres pestañas:

En la primera pestaña hacemos la búsqueda en Amadeus estableciendo los parámetros de los vuelos:

 

Una vez que tenemos los vuelos en MongoDB, podemos hacer consultas estableciendo varios criterios, en este caso un rango de precios:

Por último, en la tercera pestaña podemos hacer consultas mediante secuencias MQL:


A continuación el programa en python:


domingo, 1 de agosto de 2021

MongoDB y API de Amadeus

Si uno ya tiene experiencia en RDBSM, una pregunta razonable sería: ¿para que complicarme con una BBDD NoSQL?

En este artículo presento un ejemplo de uso de MongoDB para resolver rápidamente una necesidad específica.

La empresa Amadeus dispone de una API para desarrolladores que permite hacer diferentes tipos de consultas relacionadas con los sectores de aerolíneas, hoteles, etc.

Un ejemplo de consulta a esta API es: amadeus.shopping.flight_offers_search.get()

Esta llamada permite consultar los vuelos disponibles para una ruta y fecha determinadas. La informacion devuelta está en formato JSON.

En el script Python adjunto podemos ver lo fácil que es hacer la llamada a la API e insertar la información devuelta en la colección Amadeus.flight_offers.

 
No hay necesidad de procesos previos para crear la BBDD ni la colección. Tampoco necesitamos saber la estructura de la información, sólo la insertamos directamente en MongoDB.

 
Una vez que tenemos la colección creada, podemos hacer las consultas que queramos.

En el ejemplo mostrado en la pantalla siguiente, consultamos los vuelos con precio menor a 150€ y sólo nos interesa que nos muestre los campos aerolínea, precio, duración del vuelo y aeropuerto de salida de cada segmento del vuelo:

Hemos encontrado 15 vuelos que cumplen los criterios de la consulta.

Como podemos ver, una solución realmente rápida y eficiente.

sábado, 10 de julio de 2021

MongoDB: Lenguaje SQL

MongoDB es un gestor de bases de datos NoSQL, por lo que a diferencia de las bases de datos relacionales, no utiliza el lenguaje SQL. MongoDB dispone de un lenguaje de consulta de información  propio: MongoDB Query Language (MQL).

Vamos a revisar muy brevemente las caractarerísticas de cada uno de ellos: SQL y MQL.

El lenguaje SQL permite construir sentencias para hacer todo tipo de operaciones sobre bases de datos relacionales: Crear/eliminar una BBDD, crear/modificar/eliminar tablas/indices/vistas, consultar/modificar/agregar/eliminar filas de tablas, etc.

Esto es debido a que SQL incluye: un lenguaje de definición de datos, un lenguaje de manipulación de datos y un lenguaje de control de datos.

Algunos ejemplos de sentencias SQL :

  • Crear una tabla:   CREATE TABLE jobs( 
                                     ID int,
     
                                     country varchar(255),

                                     sector varchar(255),

                                     company varchar(255),
     
                                     job_description varchar(255)

                                 );
     
  •  Consultar una tabla: SELECT company, country,source from jobs where sector="finance"

Es relativamente fácil desarrollar un programa sencillo, por ejemplo en python, para conectarse con una BBDD relacional y ejecutar sentencias SQL de cualquier tipo.

Sin embargo en MongoDB no tenemos esta flexibilidad, ya que el lenguaje MQL no se basa en sentencias, sino en comandos/instrucciones específicas para cada tipo de operación.

Por ejemplo una consulta en MQL parecida a la anterior en SQL sería:
   db.jobs.find(
        {"sector" : "finance"},
        {"company":1,"country":1,
"source":1}
   )

 
En la instrucción anterior db es la variable de la conexión a MongoDB, jobs es la colección sobre la que queremos trabajar y find  es el comando especifico para la operación que queremos realizar, en este caso una consulta con la condición sector="finance", y sólo queremos mostrar los campos company, country y source.

Para los que estamos acostumbrados a trabajar con SQL no es fácil pasar de éste a MQL, ya que las estructuras son totalmente diferentes.

Sin embargo hay una serie de herramientas que nos permiten convertir secuencias SQL en MQL:

  • Tenemos por ejemplo la página site24x7 que acepta sentencias SQL y genera el comando MQL equivalente.
  • Adicionalmente algunas aplicaciones de administración de MongoDB incluyen esta facilidad, por ejemplo NoSQLBooster.
  • La documentación en linea de MongoDB incluye una página con mapeo SQL a MQL: docs.mongodb.com
  • La herramienta MongoDB Connector for BI permite utilizar sentencias SQL para extraer información de una BBDD  MongoDB y alimentar herramientas BI como Tableau,Qlik, MicroStrategy, etc.

 





sábado, 3 de julio de 2021

MongoDB y Python GUI (tkinter)

MongoDB pertenece a los sistemas de almacenamiento de información NoSQL (Not Only SQL).

Este motor de almacenamiento es uno de los más populares cuando necesitamos administrar grandes cantidades de información con "estructura variable", es decir cuando la información está constituida por unidades que no tiene la misma estructura.

Podemos tener un colección (tabla) con documentos (filas) cuyos campos no tienen la misma estructura.
Supongamos que tenemos una colección de libros en soporte físico y electrónico. En el caso del soporte físico tal vez nos interese saber su formato : libro de bolsillo, tapa dura, etc. Esta propiedad no aplica para un libro electrónico, por lo tanto no es necesario reservar un campo para algo que no se necesita. De ahí que en este caso, la ficha de un libro físico tenga mas campos que la de un libro electrónico.

Además del tipo de información que podemos guardar,  MongoDB incluye optimizaciones como por ejemplo crecimiento horizontal, flexibilidad, búsquedas, capacidad de gestión de grandes volumenes de datos (big data), etc.

Python es una de las herramientas mas utilizadas para la gestión/análisis de datos.
Python dispone de varios módulos para trabajar con MongoDB, entre ellos está pymongo.

Supongamos que tenemos una base de datos llamada data_engineer, y en esta BBDD tenemos la colección jobs de documentos asociados a ofertas de trabajo , un script típico de conexión (asumiendo que el servidor está en el ordenador local y configurado con el puerto 27017)

 

Asumiendo que la colección jobs tiene los campos : source, date, country, sector, company, job_descripcition y job_expertice (campos donde se registra la información de cada oferta de trabajo), un script para agregar un documento en la colección sería:

Si deseamos desarrollar un programa en python con interfase gráfica tenemos a nuestra disposición diferentes módulos para tal fin. El mas veterano y con una gran cantidad de documentacion en internet es tkinter, que adicionalmente viene preinstalado en python

En la imagen siguiente tenemos un ejemplo de una aplicación gráfica sencilla que gestiona la colección jobs mencionada anteriormente:

En la siguiente imagen podemos ver un ejemplo sencillo de como visualizar las bases de datos existentes, sus colecciones y los primeros documentos de cada colección.
 

 
Desde luego, esto no deja de ser un ejemplo muy básico de lo que podemos hacer en python para comunicarnos con un servidor MongoDB. Existen aplicaciones comerciales y OpenSource muy completas para realizar la gestión de MongoDB : MongoDB Compass, NoSQLBooster, DBeaver, RazorSQL, etc.