赋值节点

当需要将上游节点的查询或输出结果传递给下游节点时,可通过赋值节点实现。赋值节点支持 MaxCompute SQLShellPython 2 三种语言,会自动将最后一条查询或输出结果赋值给节点的输出参数(outputs),下游节点可以通过引用该参数来获取上游的输出结果。

适用范围

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

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

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

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

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

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

    image

操作步骤

下面以将赋值节点的结果传递给Shell节点为例,介绍通用的操作流程。

  1. 配置上游赋值节点

    在工作流中,创建并编辑一个赋值节点,按需选择MaxCompute SQLShellPython 2,并编写代码以产生需要传递给下游的结果。

    image

  2. 配置下游Shell节点

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

    image

    1. 在右侧调度配置中,选择节点上下文参数页签。

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

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

      说明

      配置完成后,下游节点会自动与上游赋值节点建立依赖关系。

    4. 完成参数配置后,即可在下游Shell节点的代码中通过${param}的格式来使用上游传递过来的值。

  3. 运行验证。

    1. 返回工作流,单击工具栏上方的发布,选择全量发布。

    2. 单击发布到生产环境下的补数据,并前往运维中心模块的运维助手 > 补数据,查看最终运行结果是否符合预期。

注意事项

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

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

  • 语法限制

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

    • MaxCompute SQL模式下暂不支持with语法

  • 输出格式

    赋值语言

    outputs参数取值

    outputs参数格式

    MaxCompute SQL

    最后一行select语句的输出作为赋值参数。

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

    Python 2

    最后一行print语句的输出。

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

    Shell

    最后一行echo语句的数据。

使用示例:分语言详解

不同语言的赋值节点,其输出结果(outputs)的数据格式和下游节点的引用方式略有不同。下面将分别举例说明。

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

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

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

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

    SELECT 'value1', 'value2'
    UNION ALL 
    SELECT 'value3', 'value4';
  • 下游节点(Shell节点)配置

    Shell节点中添加名为param的输入参数,并引用上游SQL节点的outputs。然后可以使用如下代码读取数据:

    # 直接输出整个二维数组
    echo "整个结果集: ${param}"
    
    # 输出第一行数据(一个一维数组)
    echo "第一行: ${param[0]}"
    
    # 输出第一行第二个字段的值
    echo "第一行第二个字段: ${param[0][1]}"
  • 预期输出结果

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

    整个结果集: value1,value2
    value3,value4
    第一行: value1,value2
    第一行第二个字段: value2

示例二:传递 Python 输出结果

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

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

    Python 2代码如下:

    print "hello,dataworks";
  • 下游节点(Shell节点)配置

    Shell节点中添加名为param的输入参数,并引用上游赋值节点的outputs。然后可以使用如下代码读取数据:

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

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

    整个结果集: "hello","dataworks"
    第一个元素: hello
    第二个元素: dataworks

示例三:传递 Shell 输出结果

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

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

    Shell代码如下:

    echo "hello,dataworks";
  • 下游节点(Shell节点)配置

    Shell节点中添加名为param的输入参数,并引用上游Shell节点的outputs。然后可以使用如下代码读取数据:

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

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

    整个结果集: "hello","dataworks"
    第一个元素: hello
    第二个元素: dataworks

高级应用

与循环节点配合使用

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

在其他节点类型中使用赋值参数

赋值节点目前仅支持MaxCompute SQLShellPython 2 三种语言,部分节点(如EMR HiveHologres SQLEMR Spark SQLAnalyticDB for PostgreSQLClickHouse SQLMySQL节点等)自身支持赋值参数功能,实现与赋值节点相同的效果。

image

常见问题

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

A:MaxCompute SQL缺少Select语句,请添加Select语句。