yato — самый маленький оркестратор в мире, который управляет преобразованиями данных SQL поверх DuckDB. Вы просто даете папку с SQL-запросами, и она угадывает DAG и выполняет запросы в правильном порядке.
yato работает с Python 3.9+.
pip install yato-lib
Создайте папку с именем sql
и поместите в нее файлы SQL. Например, вы можете использовать два запроса, приведенные в папке примера.
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 ()
Вы также можете запустить yato с помощью командной строки:
yato run --db tmp.duckdb sql/
yato предназначен для работы в паре с dlt. dlt занимается загрузкой данных и преобразованием данных.
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 ()
Даже если бы нам хотелось делать все на SQL, иногда случается, что написание преобразования на Python с помощью pandas (или других библиотек) может оказаться быстрее.
Вот почему вы можете смешивать преобразования SQL и Python в yato.
Для этого вы можете добавить файл Python в папку преобразования. В этом файле Python вам необходимо реализовать класс Transformation
с помощью метода run
. Если вы зависите от другого преобразования SQL, вам необходимо определить исходный SQL-запрос в статическом методе с именем source_sql
.
Ниже приведен пример преобразования (например, orders.py
). Платформа поймет, что заказы должны выполняться после 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 поддерживает переменные env в запросах SQL (как в примере ниже). Будьте осторожны: по умолчанию возникает проблема, если переменная env не определена.
SELECT {{ VALUE }}, {{ OTHER_VALUE }}
yato использует замечательную библиотеку SQLGlot для синтаксического анализа SQL-запросов и построения DAG зависимостей. Затем он выполняет запросы в правильном порядке.
Почему стоит выбрать yato вместо dbt Core, SQLMesh или lea?
На этот вопрос нет хорошего ответа, но yato не предназначен для полной замены оркестраторов преобразования SQL. yato предназначен для быстрой установки и настройки с несколькими функциями. Даешь папку с кучей SQL (или Python) внутри и она запускается.
Вы можете представить ято как черный для оркестровки преобразований. Всего один параметр и все.
Почему только DuckDB
На данный момент yato поддерживает только DuckDB в качестве бэкенда/диалекта. Основная причина заключается в том, что DuckDB предлагает функции, которые было бы сложно реализовать с помощью базы данных клиент/сервер. Я не исключаю добавить Postgres или облачные хранилища, но придется подумать, как это сделать, особенно при смешивании преобразований SQL и Python.
Может ли yato поддерживать шаблоны Jinja?
Я нет. Я не уверен, что так должно быть. Я думаю, что когда вы добавляете шаблоны Jinja в свои SQL-запросы, вы уже зашли слишком далеко. Я бы рекомендовал не использовать для этого ято. Тем не менее, если вы действительно хотите использовать yato и получить поддержку Jinja, свяжитесь со мной.
Небольшое примечание: yato поддерживает переменные env в запросах SQL.
Могу ли я внести свой вклад?
Да, очевидно, сейчас проект находится на ранней стадии, и я был бы рад получить отзывы и предложения. Имейте в виду, что это небольшой оркестратор, и закрывать весь пробел другими оркестраторами нет смысла, потому что просто используйте их, они потрясающие.