yato es el orquestador más pequeño del mundo que puede orquestar transformaciones de datos SQL sobre DuckDB. Simplemente le proporciona una carpeta con consultas SQL, adivina el DAG y ejecuta las consultas en el orden correcto.
yato funciona con Python 3.9+.
pip install yato-lib
Cree una carpeta llamada sql
y coloque sus archivos SQL en ella; por ejemplo, puede utilizar las 2 consultas que figuran en la carpeta de ejemplo.
from yato import Yato
yato = Yato (
# The path of the file in which yato will run the SQL queries.
# If you want to run it in memory, just set it to :memory:
database_path = "tmp.duckdb" ,
# This is the folder where the SQL files are located.
# The names of the files will determine the name of the table created.
sql_folder = "sql/" ,
# The name of the DuckDB schema where the tables will be created.
schema = "transform" ,
)
# Runs yato against the DuckDB database with the queries in order.
yato . run ()
También puedes ejecutar yato con el cli:
yato run --db tmp.duckdb sql/
yato está diseñado para funcionar en conjunto con dlt. dlt maneja la carga de datos y yato la transformación de datos.
import dlt
from yato import Yato
yato = Yato (
database_path = "db.duckdb" ,
sql_folder = "sql/" ,
schema = "transform" ,
)
# You restore the database from S3 before runnning dlt
yato . restore ()
pipeline = dlt . pipeline (
pipeline_name = "get_my_data" ,
destination = "duckdb" ,
dataset_name = "production" ,
credentials = "db.duckdb" ,
)
data = my_source ()
load_info = pipeline . run ( data )
# You backup the database after a successful dlt run
yato . backup ()
yato . run ()
Incluso si nos encantaría hacer todo en SQL, a veces sucede que escribir una transformación en Python con pandas (u otras bibliotecas) puede ser más rápido.
Es por eso que puedes combinar la transformación de SQL y Python en yato.
Para hacerlo puedes agregar un archivo Python en la carpeta de transformación. En este archivo Python debes implementar una clase Transformation
con un método run
. Si depende de otra transformación de SQL, debe definir la consulta SQL de origen en un método estático llamado source_sql
.
A continuación se muestra un ejemplo de una transformación (como orders.py
). El marco entenderá que los pedidos deben ejecutarse después de source_orders.
from yato import Transformation
class Orders ( Transformation ):
@ staticmethod
def source_sql ():
return "SELECT * FROM source_orders"
def run ( self , context , * args , ** kwargs ):
df = self . get_source ( context )
df [ "new_column" ] = 1
return df
yato admite variables env en las consultas SQL (como en el siguiente ejemplo). Tenga cuidado, de forma predeterminada, genera un problema si la variable env no está definida.
SELECT {{ VALUE }}, {{ OTHER_VALUE }}
yato run se basa en la increíble biblioteca SQLGlot para analizar sintácticamente las consultas SQL y crear un DAG de las dependencias. Luego, ejecuta las consultas en el orden correcto.
¿Por qué elegir yato en lugar de dbt Core, SQLMesh o lea?
No hay una buena respuesta a esta pregunta, pero yato no ha sido diseñado para reemplazar completamente a los orquestadores de transformación SQL. yato está destinado a ser rápido de instalar y configurar con algunas características. Le das una carpeta con un montón de SQL (o Python) dentro y se ejecuta.
Puedes imaginar a Yato como negro para la orquestación de transformaciones. Sólo un parámetro y aquí tienes.
¿Por qué solo DuckDB?
Por el momento, yato solo admite DuckDB como backend/dialecto. La razón principal es que DuckDB ofrece características que serían difíciles de implementar con una base de datos cliente/servidor. No excluyo agregar Postgres o almacenes en la nube, pero sería necesario pensar cómo hacerlo, especialmente al mezclar transformaciones de SQL y Python.
¿Yato puede soportar las plantillas de Jinja?
Yo no. No estoy seguro de que debería hacerlo. Creo que cuando agregas plantillas de Jinja a tus consultas SQL ya estás demasiado lejos. Recomendaría no usar yato para esto. Aún así, si realmente quieres usar yato y contar con el soporte de Jinja, comuníquese conmigo.
Pequeña nota, yato admite variables env en las consultas SQL.
¿Puedo contribuir?
Sí, obviamente, en este momento el proyecto se encuentra en su etapa inicial y me encantaría recibir comentarios y contribuciones. Tenga en cuenta que este es un orquestador pequeño y cubrir toda la brecha con otros orquestadores no tiene sentido porque simplemente usarlos son increíbles.