Yato ist der kleinste Orchestrator der Welt, der SQL-Datentransformationen auf DuckDB orchestriert. Sie geben einfach einen Ordner mit SQL-Abfragen an und er errät die DAG und führt die Abfragen in der richtigen Reihenfolge aus.
Yato funktioniert mit Python 3.9+.
pip install yato-lib
Erstellen Sie einen Ordner mit dem Namen sql
und legen Sie Ihre SQL-Dateien darin ab. Sie können beispielsweise die beiden im Beispielordner angegebenen Abfragen verwenden.
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 ()
Sie können Yato auch mit der CLI ausführen:
yato run --db tmp.duckdb sql/
Yato ist für die Zusammenarbeit mit dlt konzipiert. dlt übernimmt das Laden der Daten und yato die Datentransformation.
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 ()
Selbst wenn wir gerne alles mit SQL machen würden, kommt es manchmal vor, dass das Schreiben einer Transformation in Python mit Pandas (oder anderen Bibliotheken) schneller sein könnte.
Aus diesem Grund können Sie SQL- und Python-Transformation in Yato kombinieren.
Dazu können Sie eine Python-Datei im Transformationsordner hinzufügen. In dieser Python-Datei müssen Sie eine Transformation
mit einer run
implementieren. Wenn Sie auf andere SQL-Transformationen angewiesen sind, müssen Sie die Quell-SQL-Abfrage in einer statischen Methode namens source_sql
definieren.
Nachfolgend ein Beispiel für eine Transformation (wie orders.py
). Das Framework versteht, dass Aufträge nach „source_orders“ ausgeführt werden müssen.
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 unterstützt Env-Variablen in den SQL-Abfragen (wie im Beispiel unten). Seien Sie vorsichtig, da die Standardeinstellung ein Problem darstellt, wenn die Umgebungsvariable nicht definiert ist.
SELECT {{ VALUE }}, {{ OTHER_VALUE }}
Yato-Ausführungen basieren auf der erstaunlichen SQLGlot-Bibliothek, um die SQL-Abfragen syntaktisch zu analysieren und eine DAG der Abhängigkeiten zu erstellen. Anschließend werden die Abfragen in der richtigen Reihenfolge ausgeführt.
Warum Yato gegenüber DBT Core, SQLMesh oder Lea wählen?
Es gibt keine gute Antwort auf diese Frage, aber Yato ist nicht dafür konzipiert, SQL-Transformations-Orchestratoren vollständig zu ersetzen. Yato soll mit wenigen Funktionen schnell einzurichten und zu konfigurieren sein. Sie geben einen Ordner mit einer Menge SQL (oder Python) an und es wird ausgeführt.
Sie können sich Yato wie Schwarz für die Orchestrierung von Transformationen vorstellen. Nur ein Parameter und los geht's.
Warum nur DuckDB
Im Moment unterstützt Yato nur DuckDB als Backend/Dialekt. Der Hauptgrund dafür ist, dass DuckDB Funktionen bietet, die mit einer Client/Server-Datenbank nur schwer zu implementieren wären. Ich schließe das Hinzufügen von Postgres oder Cloud Warehouses nicht aus, aber es müsste darüber nachgedacht werden, wie das geht, insbesondere wenn SQL- und Python-Transformationen gemischt werden.
Kann Yato Jinja-Templating unterstützen?
Ich nicht. Ich bin mir nicht sicher, ob das so sein sollte. Ich denke, wenn Sie Jinja-Templates zu Ihren SQL-Abfragen hinzufügen, sind Sie bereits zu weit. Ich würde empfehlen, hierfür kein Yato zu verwenden. Wenn Sie Yato wirklich nutzen und Jinja-Unterstützung benötigen, wenden Sie sich an mich.
Kleiner Hinweis: Yato unterstützt Env-Variablen in den SQL-Abfragen.
Kann ich einen Beitrag leisten?
Ja, natürlich befindet sich das Projekt derzeit in einem frühen Stadium und ich würde mich über Rückmeldungen und Beiträge freuen. Denken Sie daran, dass es sich hierbei um einen kleinen Orchestrator handelt und es keinen Sinn macht, die Lücke mit anderen Ochestratoren zu schließen, denn sie sind großartig, wenn man sie einfach benutzt.