赋值节点

更新时间:
复制 MD 格式

当您需要将上游节点任务的查询或输出结果提供给下游节点使用时,可通过赋值节点实现。赋值节点(即上游节点)支持 ODPS SQL、Python 2和Shell三种语言,会自动将最后一条查询或输出结果赋值给节点自带的输出参数(outputs),下游节点可以通过引用该参数来获取赋值节点的输出结果。

适用范围

  • 版本限制:仅支持DataWorks标准版及以上版本。

  • 权限限制:RAM账号已被添加至对应工作空间中,并具有开发或空间管理员角色权限。详情请参见为工作空间添加空间成员。

核心概念:参数的传递与引用

赋值节点的核心是参数传递,负责将上游节点产生的数据传递给下游节点。

  • 上游赋值节点:负责产生数据。它会将最后一条输出或查询结果自动赋值给一个名为 outputs 的节点输出参数。

  • 下游业务节点:负责接收和使用数据。通过在节点配置中添加一个本节点输入参数(例如,param),并让它引用上游节点的 outputs 参数,就可以在代码中使用这些数据。

    image

传递参数格式说明

赋值节点的传递参数格式说明如下:

赋值语言

传递参数范围

传递参数格式

ODPS SQL

获取最后一行 SELECT 语句的输出。

将输出结果作为一个二维数组传递至下游。

Python 2

获取最后一行 print 语句的输出。

将输出结果转化成字符串,并基于逗号(,)分割为一维数组。

例如,赋值节点最后一行输出为'Electronics,Clothing,Books',传递给下游的格式为['Electronics','Clothing','Books']。

Shell

获取最后一行 echo 语句的输出。

操作步骤

下面以将 ODPS SQL 赋值节点的结果传递给 Shell 节点为例,介绍通用的操作流程。实际场景中,支持任意节点作为下游节点。

  1. 配置上游赋值节点

    在业务流程中,创建并编辑一个赋值节点。在代码编辑页面,按需选择 ODPS SQL、Python、Shell,并编写代码以产生需要传递给下游的结果。

  2. 配置下游 Shell 节点

    创建Shell节点,在Shell节点的编辑页面,引用上游结果:

    1. 在 Shell 节点的编辑页面,单击右侧的调度配置,选择节点上下文页签。

    2. 在本节点输入参数区域,单击添加。

    3. 在弹出的对话框中,选择上游赋值节点的输出参数 outputs,并为当前节点的输入参数自定义一个参数名称(例如:param)。

      配置完成后,下游节点会自动与上游赋值节点建立依赖关系。
    4. 完成参数配置后,即可在下游 Shell 节点的代码中通过 ${param} 的格式来使用上游传递过来的值。

  3. 运行验证

    双击业务流程名称,在业务流程编辑页面单击工具栏的运行图标,运行业务流程,查看引用结果是否正确。您也可以将节点提交至生产环境后,进入生产环境运维中心执行冒烟测试操作,测试运行结果。

说明

DataWorks提供ETL工作流模板(赋值节点应用)供您快速体验赋值节点能力,详情请参见ETL工作流快速体验。

注意事项

  • 传递层级:赋值节点参数只能传递给直接下游的一层子节点,不支持跨层级的节点传递。

  • 传递大小限制:传递值最大为2MB。如果赋值语句的输出结果超过该限制,赋值节点会运行失败。

  • 语法限制:

    • 赋值节点代码中不支持添加注释,否则可能导致运行结果异常。

    • ODPS SQL模式下暂不支持WITH语法。

使用示例:分语言详解

不同语言的赋值节点,其输出结果(outputs)的数据格式和下游节点的引用方式略有不同。

示例一:传递 ODPS SQL 查询结果

SQL的查询结果会作为一个二维数组传递给下游。

  • 上游节点(赋值节点-SQL)配置

    假设SQL代码如下,查询返回两行两列的数据:

    SELECT 'beijing', '1001'
    UNION ALL 
    SELECT 'hangzhou', '1002';
  • 下游节点(Shell节点)配置和输出

    在Shell节点中添加名为region的输入参数,并引用上游SQL节点的outputs。

    编写如下代码读取数据:

    echo "整个结果集: ${region}"
    echo "第一行: ${region[0]}"
    echo "第一行第二个字段: ${region[0][1]}"

    DataWorks将直接解析参数,并做静态替换。运行输出如下:

    整个结果集: beijing,1001
    hangzhou,1002
    第一行: beijing,1001
    第一行第二个字段: 1001

示例二:传递 Python 2 输出结果

Python 2的print语句输出结果会基于逗号,分割,并作为一个一维数组传递给下游。

  • 上游节点(赋值节点-Python 2)配置

    Python 2代码如下:

    print 'Electronics, Clothing, Books';
  • 下游节点(Shell节点)配置和输出

    在Shell节点中添加名为types的输入参数,并引用上游赋值节点的outputs。

    编写如下代码读取数据:

    # 直接输出整个一维数组
    echo "整个结果集: ${types}"
    
    # 按索引输出数组中的元素
    echo "第二个元素: ${types[1]}"

    DataWorks将直接解析参数,并做静态替换。运行输出如下:

    整个结果集: Electronics,Clothing,Books
    第二个元素: Clothing
说明

Shell节点处理逻辑和Python 2类似,不再重复说明。

常见问题

  • Q:在ODPS SQL语言下,报错“find no select sql in sql assignment!”。

    A:ODPS SQL缺少Select语句,请添加Select语句。暂不支持WITH语句,若使用WITH语句,也会报此错误。

  • Q:在Shell、Python语言下,输出不符合预期。

    A :检查元素本身是否带有逗号,可先在赋值节点处对元素转义,再在下游节点进行复原。

  • Q:下游节点支持上游配置多个赋值节点来接收多个结果么?

    A :支持,只需给不同节点结果赋值不同的参数即可。

  • Q:赋值节点支持其他语言类型么?

    A:赋值节点目前仅支持ODPS SQL、Python 2和Shell三种语言,部分节点(如EMR Hive、Hologres SQL、EMR Spark SQL、AnalyticDB for PostgreSQL、ClickHouse SQL和MySQL节点等)自身支持赋值参数功能,可实现与赋值节点相同的效果。

相关文档

当下游是遍历节点(for-each)或循环节点(do-while)时,请参见配置for-each节点、配置do-while节点配合使用。