Dagster数据管道必学:资产间传值的3种优雅实现方式

本文详解Dagster中数据资产间传递数据的三种方式:显式外部存储、隐式I/O管理器和合并任务为单一资产。通过具体代码示例对比各方法优缺点,帮助您根据场景选择最优方案。

在这里插入图片描述

一、显式外部存储传递

适用场景:需要明确控制数据存储位置的环境

import sqlite3
import dagster as dg

@dg.asset
def asset1():
    with sqlite3.connect("database.sqlite") as conn:
        conn.execute("CREATE TABLE IF NOT EXISTS test (i INTEGER)")
        conn.execute("INSERT INTO test VALUES (42)")

@dg.asset(deps=[asset1])
def asset2(context):
    with sqlite3.connect("database.sqlite") as conn:
        result = conn.execute("SELECT * FROM test").fetchall()
        context.log.info(result)

defs = dg.Definitions(assets=[asset1, asset2])

优势

  • 数据流向清晰可见
  • 存储位置高度灵活(可配置不同环境)

劣势

  • 需手动管理连接和事务
  • 需处理连接异常等边缘情况

二、隐式I/O管理器传递

适用场景:希望简化数据读写逻辑的场景

import pandas as pd
from dagster_duckdb_pandas import DuckDBPandasIOManager

duckdb_io_manager = DuckDBPandasIOManager(database="my_database.duckdb")

@dg.asset
def people():
    return pd.DataFrame({"id": [1,2,3], "name": ["Alice", "Bob", "Charlie"]})

@dg.asset
def combined_data(people):
    # 自动从I/O管理器获取people数据
    return people  # 实际使用时会是更复杂的数据处理

defs = dg.Definitions(
    assets=[people, combined_data],
    resources={"io_manager": duckdb_io_manager}
)

优势

  • 自动处理数据读写
  • 环境间切换方便(只需更换I/O管理器)

劣势

  • 定制化能力有限
  • 命名规则可能受限

三、合并任务为单一资产

适用场景:数据量小且需高性能处理的场景

import dagster as dg

@dg.asset
def my_dataset():
    # 合并三个步骤为一个资产
    zipped = download_files()  # 实际实现中应包含错误处理
    files = unzip_files(zipped)
    load_data(files)

优势

  • 计算逻辑集中,易于维护
  • 减少外部存储依赖

劣势

  • 假设数据量足够小
  • 功能复用性降低
  • 环境适应性差

最后总结

方法适用场景主要优势主要劣势
显式外部存储需要明确控制存储位置数据流清晰,存储灵活手动管理连接,需处理异常
隐式I/O管理器希望简化读写逻辑自动化处理,环境切换方便定制受限,命名规则固定
合并任务小数据量高性能需求逻辑集中,减少存储依赖数据量大时失效,复用性差

选择建议

  1. 复杂系统优先考虑I/O管理器
  2. 需要严格审计追踪时使用显式存储
  3. 原型开发或小数据处理可用合并任务

掌握这些方法后,您可以根据项目需求灵活选择最适合的数据传递方式,构建高效可靠的数据管道系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值