展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Dagster数据流转与参数使用技巧

Dagster数据流转与参数使用技巧

本教程旨在解决Dagster中利用Config进行用户自定义参数配置,并实现资产(Asset)间数据正确传递的常见问题。文章将详细阐述如何通过函数参数注入上游资产输出,并结合类型注解确保数据流转的准确性,从而避免配置错误,构建高效且可配置的数据管道。

本文目录

    Dagster资产间数据流转与用户自定义参数的正确姿势

    本教程旨在解决Dagster中利用Config进行用户自定义参数配置,并实现资产(Asset)间数据正确传递的常见问题。文章将详细阐述如何通过函数参数注入上游资产输出,并结合类型注解确保数据流转的准确性,从而避免配置错误,构建高效且可配置的数据管道。

    1. 理解Dagster资产与配置

    Dagster是一个用于构建、测试和监控数据管道的Python框架。在Dagster中,核心概念是“资产”(Assets),它们代表了数据管道中的逻辑单元或数据实体。每个资产都应该能够独立地生成或转换数据。

    • 资产(Assets): 资产是数据世界中的一个逻辑表示,可以是数据库表、文件、机器学习模型等。在Dagster中,我们通过 @asset 装饰器定义函数来创建资产,这些函数负责生成或更新数据。
    • 配置(Config): 为了使资产更具通用性和灵活性,Dagster允许我们通过 Config 对象为资产提供运行时配置参数。用户可以在执行管道时,通过UI或代码为这些参数赋值,从而改变资产的行为,例如指定数据拉取的起始日期或过滤条件。

    2. 常见问题与错误分析

    在构建Dagster管道时,开发者常遇到的一个挑战是如何在资产之间正确地传递数据,同时又能利用用户自定义的配置参数。原始问题中遇到的 DagsterInvalidConfigError 错误,以及无法将上游资产的结果传递给下游资产,是这种挑战的典型体现。

    错误情境复现: 当尝试在一个资产中直接调用另一个资产函数来获取其输出时,或未正确声明资产间的依赖关系时,就容易出现问题。例如,在 filter_data 资产中直接调用 generate_dataset(),以及在 filter_again 资产中直接调用 filter_data(),这并非Dagster推荐的数据流转方式。

    # 错误示例片段
    import pandas as pd
    from dagster import asset, Config
    
    # ... (generate_dataset 函数定义省略,与正确代码相同)
    
    class fruit_config(Config):
        fruit_select: str
    
    @asset(deps=[generate_dataset]) # 这里的deps虽然声明了,但内部调用方式是错误的
    def filter_data(config: fruit_config):
        # 错误:直接调用generate_dataset()会重新执行,且无法获取其物化结果
        df = generate_dataset()
        df2 = df[df['fruit'] == config.fruit_select]
        return df2
    
    @asset(deps=[filter_data]) # 这里的deps虽然声明了,但内部调用方式是错误的
    def filter_again():
        # 错误:直接调用filter_data()同样会导致问题
        df2 = filter_data()
        df3 = df2[df2['units'] > 5]
        return df3

    这种方式会导致以下问题:

    1. 数据流转中断: Dagster的资产系统是基于物化(materialization)和依赖关系构建的。直接调用函数并不会传递上游资产的物化结果,而是会重新执行该函数,这通常不是期望的行为,也可能导致数据不一致或性能问题。
    2. 配置错误: 当资产被定义为需要 Config 参数时,Dagster会在运行时查找相应的配置。如果资产间的依赖和数据流转机制不正确,Dagster可能无法正确地注入配置,从而抛出 DagsterInvalidConfigError。

    3. Dagster资产间数据流转的正确姿势

    Dagster设计了一套优雅的机制来处理资产间的数据流转和配置注入。核心思想是利用Python的函数参数来声明依赖和接收数据。

    3.1 通过函数参数传递上游资产输出

    在Dagster中,一个资产的输出可以作为另一个资产的输入。实现这一点的标准方式是将上游资产的名称作为参数添加到下游资产的函数签名中。Dagster运行时会自动将上游资产的物化结果注入到这些参数中。

    例如,如果 generate_dataset 资产产生一个 pd.DataFrame,并且 filter_data 资产需要这个DataFrame作为输入,那么 filter_data 的函数签名应包含一个名为 generate_dataset 的参数。

    3.2 类型注解的重要性

    为了增强代码的可读性、可维护性以及帮助Dagster更好地理解数据类型,强烈建议为资产函数的输入和输出添加类型注解。这不仅让代码意图更清晰,也有助于在开发阶段捕获潜在的类型不匹配错误。

    3.3 结合用户配置参数

    对于需要用户自定义参数的资产,可以通过在函数签名中添加一个类型为 Config 子类的参数来注入配置。Dagster会在执行时提示用户提供这些配置。

    正确的数据流转和配置注入原则:

    • 声明依赖: 无需显式使用 deps 参数(除非有特殊需求),Dagster会根据函数参数自动推断资产依赖。
    • 参数命名: 下游资产函数中用于接收上游输出的参数名,应与上游资产函数名(或其 key)保持一致。
    • 类型注解: 为资产函数的返回值和接收上游输出的参数添加类型注解,例如 -> pd.DataFrame。

    4. 示例代码:构建可配置的数据处理管道

    下面是根据上述原则修正后的Dagster资产定义,它展示了如何正确地传递数据和注入配置。

    import pandas as pd
    import random
    from datetime import datetime, timedelta
    from dagster import asset, Config, materialize
    
    # 1. 定义生成原始数据的资产
    @asset
    def generate_dataset() -> pd.DataFrame:
        """
        生成一个包含水果、单位和日期的随机数据集。
        """
        def random_dates(start_date, end_date, n=10):
            date_range = end_date - start_date
            random_dates_list = [start_date + timedelta(days=random.randint(0, date_range.days)) for _ in range(n)]
            return random_dates_list
    
        random.seed(42) # 确保结果可复现
        num_rows = 100
        fruits = ['Apple', 'Banana', 'Orange', 'Grapes', 'Kiwi']
        fruit_column = [random.choice(fruits) for _ in range(num_rows)]
        units_column = [random.randint(1, 10) for _ in range(num_rows)]
        start_date = datetime(2022, 1, 1)
        end_date = datetime(2022, 12, 31)
        date_column = random_dates(start_date, end_date, num_rows)
    
        df = pd.DataFrame({
            'fruit': fruit_column,
            'units': units_column,
            'date': date_column
        })
        print("Generated Dataset Head:\n", df.head())
        return df
    
    # 2. 定义用户配置类
    class fruit_config(Config):
        """
        用于指定要筛选的水果类型。
        """
        fruit_select: str
    
    # 3. 定义筛选数据的资产,接收上游数据和配置
    @asset
    def filter_data(generate_dataset: pd.DataFrame, config: fruit_config) -> pd.DataFrame:
        """
        根据用户配置的水果类型筛选数据集。
        参数:
            generate_dataset (pd.DataFrame): 来自上游 generate_dataset 资产的原始数据。
            config (fruit_config): 包含用户选择水果的配置对象。
        """
        # generate_dataset 参数会自动接收上游资产 generate_dataset 的输出
        filtered_df = generate_dataset[generate_dataset['fruit'] == config.fruit_select]
        print(f"Filtered Data (fruit_select='{config.fruit_select}') Head:\n", filtered_df.head())
        return filtered_df
    
    # 4. 定义再次筛选的资产,接收上游筛选后的数据
    @asset
    def filter_again(filter_data: pd.DataFrame) -> pd.DataFrame:
        """
        在已筛选的数据集上,进一步筛选单位数量大于5的记录。
        参数:
            filter_data (pd.DataFrame): 来自上游 filter_data 资产的已筛选数据。
        """
        # filter_data 参数会自动接收上游资产 filter_data 的输出
        final_df = filter_data[filter_data['units'] > 5]
        print("Final Filtered Data (units > 5) Head:\n", final_df.head())
        return final_df
    
    # 如果需要在本地直接运行测试,可以使用 materialize
    if __name__ == "__main__":
        # 示例:如何通过代码提供配置并物化资产
        # 注意:在Dagster UI中运行,配置将通过UI界面输入
        result = materialize(
            [generate_dataset, filter_data, filter_again],
            run_config={
                "ops": { # 对于资产,配置是在 "ops" 键下,尽管现在推荐使用 "assets" 键,但旧版本或某些情况下仍兼容
                    "filter_data": {
                        "config": {
                            "fruit_select": "Banana"
                        }
                    }
                }
            }
        )
        assert result.success
        print("\nPipeline execution successful!")

    5. 关键点与注意事项

    • 自动依赖推断: Dagster的 @asset 装饰器非常智能。当一个资产函数的参数名与另一个 @asset 装饰的函数名(或其 key)匹配时,Dagster会自动识别这种依赖关系,并确保上游资产在下游资产之前执行。因此,通常无需显式使用 deps 参数。
    • 参数注入: 上游资产的输出结果会作为参数值,自动注入到下游资产的相应参数中。这是Dagster实现数据流转的核心机制。
    • 配置参数命名: 当资产需要配置时,Config 对象应该作为资产函数的一个参数传入,例如 config: fruit_config。在Dagster UI中运行此管道时,系统会自动提示用户输入 fruit_select 的值。
    • 类型提示: 使用 -> pd.DataFrame 这样的类型提示,不仅提升了代码的可读性,也为Dag
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。