[Python-es] ETL

GEIS AUGUSTO GARCIA ROMERO geistein en gmail.com
Mie Sep 9 22:51:26 EDT 2020


Estimado Sr Lasizoillo
de antemano muchísimas gracias por su respuesta y por su detallada
explicación, me ha hecho entender algunas cosas, pero como usted mismo me
comenta "Espero que esto te aclare algunas dudas aunque solo sea para hacer
preguntas más específicas ;-)  "  quede bien confuso y más pues quizás por
desconocimiento del tema aunque me documente.

Le comento en cuanto a algunas cosas que logré entender y que me dice.

Extracción
========
Los datos están en formato Json desde una api, desde allí es que se
consumiría, no se si es valido como usted comenta o cuanto pesa, le
colocó una imagen desde la url de donde se consumiria y le coloco un
archivo de un trozo del json que lo parsee con python de la siguiente
manera:

 import json
 import requests
 r = requests.get('')
 json_body = r.json()
 r.raise_for_status()
 r_dict = json.loads(r.text)
 print(json.dumps(r_dict, indent = 4))

[image: image.png]

Transformación
============
En esta parte también ando un poco perdido ejemplo "extraer relaciones de
un json altamente jerarquizado" no se si el json está Jerarquizado.
aunque este pueda ser un caso simple para mi como soy inexperto puede ser
un caso complejo.

Load/carga
=========

en cuanto a esto si he visto la cuestión de que lo mas simple seria
aprender a implementar con csv, he visto que hay funciones de python/django
que se acoplan o llaman funciones  PL/SQL, no se que tan complejo pueda
resulta en cuanto a eso he visto que existen las aplicaciones de luigi y
airflow seria enter la lógica de uso de estas.

Si usted puede ayudarme a aclarar más el panorama, le agradezco.

On Thu, Sep 3, 2020 at 3:56 AM lasizoillo <lasizoillo en gmail.com> wrote:

> Buenas,
>
> Con tu pregunta lo único que puedes obtener son más preguntas y pocas
> respuestas.
>
> Extracción
> ========
> Los datos están en formato json, ¿pero dónde? Tienes que consumir un api
> registro a registro; te descargas el json todos los datos de un s3, ftp o
> cualquier otro sistema de ficheros/persistencia;... Si es un fichero bulk
> es un json válido todo el o son un conjunto de jsones válidos linea a
> linea, pero que en su conjunto no es un json válido. ¿De qué tamaño de json
> estamos hablando? Porque no es lo mismo cargar/parsear en memoria un json
> de 20Mb que uno que pesa 20Gb, aunque un fichero en el que cada línea es un
> json este problema es menor.
> Suponiendo el caso más simple usa la librería de json que viene con python
> para parsear el json. En otros casos: depende.
>
> Transformación
> ============
> No sabemos cuáles son las transformaciones necesarias para convertir los
> datos extraídos en datos cargables en tu BBDD. No es lo mismo limitarse a
> convertir fechas, que te llegan como una cadena a un tipo date o datetime
> para insertarlos en la base de datos, que tener que hacer otro tipo de
> transformaciones como por ejemplo:
> * extraer relaciones de un json altamente jerarquizado
> * extraer coordenadas del campo address, state y country
> * extraer el timezone a partir de las coordenadas anteriormente extraídas
> * normalizar códigos/ids entre el sistema externo y el propio
> * ...
> En un caso simple se puede hacer a lo loco sin preocuparse de nada. En un
> caso más complejo en el que hay que enriquecer los datos accediendo a
> sistemas externos, que conlleva una latencia, es bueno pensar en modelos
> concurrentes y tener en cuenta los posibles problemas de backpressure para
> que no te estalle en las manos.
> Suponiendo que el caso más simple es trivial, en otros casos... depende.
>
> Load/carga
> =========
> La opción más rápida/simple creo que es preparar ficheros csv y usar
> utilidades de importación de oracle
> http://www.orafaq.com/wiki/SQL*Loader_FAQ
> Aunque también puedes usar las librerías de oracle para comunicarte
> directamente con la base de datos
> https://oracle.github.io/python-cx_Oracle/
> Un ORM es algo que suele resultar cómodo, pero que va a meter capas de
> abstracción que va a hacer que la cosa no sea tan escalable. Así que mejor
> no usarlos para esto.
>
> Puedes optimizar las cosas haciendo batches y haciendo commit por cada
> batch, pero vas a tener que lidiar con el tamaño del segmento de rollback
> para que la cosa funcione bien.
> También vas a tener que lidiar con el orden en el que cargas los datos
> para evitar que de fallos insertar un registro con relaciones a otro que
> todavía no has cargado.
>
> ETL todo junto
> ===========
>
> Elige una arquitectura simple que cubra tus necesidades. Si el ETL es
> simple un script simple es lo mejor. Si por volumen de datos, complejidad
> de pasos de transformación,... la cosa se complica, analizar herramientas
> como luigi o airflow te puede simplificar la vida. Entre medias todo un
> abanico de posibilidades.
> Hazte varios datasets de pruebas:
> * Uno con pocos datos, pero representativos, para programar el happy path
> de forma rápida
> * Uno con pocos datos, pero con errores, para comprobar que has programado
> un buen control de errores
> * Varios con diferentes tamaños para probar el rendimiento y escalabilidad
> de tu proceso (tanto que vaya rápido, como el que no consuma una cantidad
> absurda de memoria o rebases algún límite de la BBDD).
>
>
> Espero que esto te aclare algunas dudas aunque solo sea para hacer
> preguntas más específicas ;-)
>
> Un saludo,
>
> Javi
>
>
> El mié., 2 sept. 2020 a las 19:43, GEIS AUGUSTO GARCIA ROMERO (<
> geistein en gmail.com>) escribió:
>
>> Muy Buenas comunidad podria dar informacion de como implementar un ETL
>> consumiendo un json para pasar los datos a unas tablas de Oracle.
>>
>> --
>> "Es mejor luchar, sabes que esta la esperanza de que ganaras." Geis.
>> Ingeniero en Sistemas y Especialista en Gerencia de Proyectos.
>> _______________________________________________
>> Python-es mailing list
>> Python-es en python.org
>> https://mail.python.org/mailman/listinfo/python-es
>>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> https://mail.python.org/mailman/listinfo/python-es
>


-- 
"Es mejor luchar, sabes que esta la esperanza de que ganaras." Geis.
Ingeniero en Sistemas y Especialista en Gerencia de Proyectos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20200909/211ee243/attachment.html>
------------ próxima parte ------------
Se ha borrado un mensaje adjunto que no está en formato texto plano...
Nombre     : image.png
Tipo       : image/png
Tamaño     : 213872 bytes
Descripción: no disponible
Url        : <http://mail.python.org/pipermail/python-es/attachments/20200909/211ee243/attachment.png>
------------ próxima parte ------------
Se ha borrado un mensaje adjunto que no está en formato texto plano...
Nombre     : parseo_json.json
Tipo       : application/json
Tamaño     : 7642 bytes
Descripción: no disponible
Url        : <http://mail.python.org/pipermail/python-es/attachments/20200909/211ee243/attachment.json>


Más información sobre la lista de distribución Python-es