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 (<
geist...@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@python.org
> https://mail.python.org/mailman/listinfo/python-es
>
_______________________________________________
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
  • [Python-es] ETL GEIS AUGUSTO GARCIA ROMERO
    • Re: [Python-es] ETL lasizoillo

Responder a