yato 是地球上最小的编排器,用于在 DuckDB 之上编排 SQL 数据转换。您只需提供一个包含 SQL 查询的文件夹,它就会猜测 DAG 并以正确的顺序运行查询。
yato 适用于 Python 3.9+。
pip install yato-lib
创建一个名为sql
的文件夹并将 SQL 文件放入其中,例如您可以使用示例文件夹中给出的 2 个查询。
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 ()
您还可以使用 cli 运行 yato:
yato run --db tmp.duckdb sql/
yato 旨在与 dlt 配合使用。 dlt 处理数据加载,yato 处理数据转换。
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,但有时使用 pandas(或其他库)在 Python 中编写转换可能会更快。
这就是为什么您可以在 yato 中混合 SQL 和 Python 转换。
为此,您可以在转换文件夹中添加一个 Python 文件。在此 Python 文件中,您必须使用run
方法实现Transformation
类。如果您依赖于其他 SQL 转换,则必须在名为source_sql
的静态方法中定义源 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 支持 SQL 查询中的环境变量(如下例所示)。请注意,默认情况下,如果未定义 env 变量,则会引发问题。
SELECT {{ VALUE }}, {{ OTHER_VALUE }}
yato 运行依赖于令人惊叹的 SQLGlot 库来语法分析 SQL 查询并构建依赖项的 DAG。然后,它以正确的顺序运行查询。
为什么选择 yato 而不是 dbt Core、SQLMesh 或 lea?
这个问题没有好的答案,但 yato 的设计目的并不是完全取代 SQL 转换协调器。 yato 旨在通过一些功能快速设置和配置。你给一个文件夹,里面有一堆 SQL(或 Python),它就会运行。
你可以想象 yato 就像黑色一样用于变换编排。只有一个参数,就可以了。
为什么只有 DuckDB
目前 yato 仅支持 DuckDB 作为后端/方言。主要原因是 DuckDB 提供了客户端/服务器数据库难以实现的功能。我不排除添加 Postgres 或云仓库,但需要考虑如何去做,尤其是在混合 SQL 和 Python 转换时。
yato 可以支持 Jinja 模板吗?
我没有。我不确定是否应该。我认为当您将 Jinja 模板添加到 SQL 查询时,您已经走得太远了。我建议不要为此使用 yato。不过,如果您确实想使用 yato 并获得 Jinja 支持,请联系我。
小注意事项,yato 支持 SQL 查询中的环境变量。
我可以贡献吗?
是的,显然,现在该项目正处于早期阶段,我很高兴收到反馈和贡献。请记住,这是一个小型协调器,覆盖与其他协调器的全部差距是没有意义的,因为只要使用它们,它们就很棒。