yato é o menor orquestrador do planeta para orquestrar transformações de dados SQL no DuckDB. Basta fornecer uma pasta com consultas SQL e ele adivinha o DAG e executa as consultas na ordem certa.
yato funciona com Python 3.9+.
pip install yato-lib
Crie uma pasta chamada sql
e coloque seus arquivos SQL nela. Você pode, por exemplo, usar as 2 consultas fornecidas na pasta de exemplo.
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 ()
Você também pode executar o yato com o cli:
yato run --db tmp.duckdb sql/
yato foi projetado para funcionar em conjunto com dlt. dlt lida com o carregamento de dados e yato com a transformação de dados.
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 ()
Mesmo que adoraríamos fazer tudo em SQL, às vezes acontece que escrever uma transformação em Python com pandas (ou outras bibliotecas) pode ser mais rápido.
É por isso que você pode misturar a transformação SQL e Python no yato.
Para fazer isso você pode adicionar um arquivo Python na pasta de transformação. Neste arquivo Python você deve implementar uma classe Transformation
com um método run
. Se você depender de outra transformação SQL, deverá definir a consulta SQL de origem em um método estático chamado source_sql
.
Abaixo um exemplo de transformação ( orders.py
). A estrutura entenderá que os pedidos precisam ser executados após 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 suporta variáveis env nas consultas SQL (como no exemplo abaixo). Tenha cuidado, por padrão, pois isso levanta um problema se a variável env não estiver definida.
SELECT {{ VALUE }}, {{ OTHER_VALUE }}
A execução do yato depende da incrível biblioteca SQLGlot para analisar sintaticamente as consultas SQL e construir um DAG das dependências. Em seguida, ele executa as consultas na ordem correta.
Por que escolher yato em vez de dbt Core, SQLMesh ou lea?
Não há uma boa resposta para essa pergunta, mas o yato não foi projetado para substituir totalmente os orquestradores de transformação SQL. O yato foi projetado para ser rápido de configurar e configurar com alguns recursos. Você dá uma pasta com um monte de SQL (ou Python) dentro e ela roda.
Você pode imaginar yato como preto para orquestração de transformações. Apenas um parâmetro e aqui está.
Por que apenas DuckDB
No momento, o yato suporta apenas DuckDB como backend/dialeto. A principal razão é que o DuckDB oferece recursos que seriam difíceis de implementar com um banco de dados cliente/servidor. Não excluo adicionar Postgres ou armazéns em nuvem, mas seria necessário pensar em como fazê-lo, especialmente ao misturar transformações SQL e Python.
O yato pode suportar modelos Jinja?
Eu não. Não tenho certeza se deveria. Acho que quando você adiciona modelos Jinja às suas consultas SQL, você já está longe demais. Eu recomendaria não usar o yato para isso. Ainda assim, se você realmente quiser usar o yato e ter o suporte do Jinja, entre em contato comigo.
Nota pequena, yato suporta variáveis env nas consultas SQL.
Posso contribuir?
Sim, obviamente, neste momento o projeto está em sua fase inicial e eu ficaria feliz em receber feedbacks e contribuições. Tenha em mente que este é um orquestrador pequeno e cobrir toda a lacuna com outros orquestradores não faz sentido porque basta usá-los, eles são incríveis.