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 باستخدام cli:
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 باستخدام الباندا (أو المكتبات الأخرى) قد تكون أسرع.
ولهذا السبب يمكنك المزج بين تحويل SQL وPython في yato.
وللقيام بذلك، يمكنك إضافة ملف Python في مجلد التحويل. في ملف Python هذا، عليك تنفيذ فئة Transformation
باستخدام طريقة run
. إذا كنت تعتمد على تحويل SQL آخر، فيجب عليك تحديد استعلام SQL المصدر بطريقة ثابتة تسمى source_sql
.
أدناه مثال للتحويل (مثل orders.py
). سوف يفهم إطار العمل أن الأوامر يجب أن يتم تشغيلها بعد أوامر_المصدر.
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.
هل يستطيع ياتو دعم قوالب جينجا؟
أنا لا. لست متأكدا من أنه ينبغي. أعتقد أنه عندما تضيف قوالب Jinja إلى استعلامات SQL الخاصة بك، فأنت بالفعل بعيد جدًا. أنصح بعدم استخدام ياتو لهذا الغرض. ومع ذلك، إذا كنت تريد حقًا استخدام yato والحصول على دعم Jinja، فاتصل بي.
ملاحظة صغيرة، يدعم yato متغيرات env في استعلامات SQL.
هل يمكنني المساهمة؟
نعم، من الواضح أن المشروع الآن في مرحلته المبكرة وسأكون سعيدًا بالحصول على تعليقات ومساهمات. ضع في اعتبارك أن هذا منسق صغير وأن تغطية الفجوة الكاملة مع عازفي الأوركسترا الآخرين ليس له أي معنى لأن مجرد استخدامهم رائع.