开发SQL组件任务

组件是一种带有多个输入参数和输出参数的SQL代码过程模板,而SQL代码过程可通过引入一个或多个源数据表,并进行过滤、连接、聚合等操作,加工出业务所需的目标表,因此,您可通过组件快速加工出符合业务需求的目标表。本文为您介绍组件的相关内容以及定义与使用。

SQL组件概述

组件介绍

在实际业务实践中,存在大量类似的SQL代码过程,过程中输入表和输出表的结构一致或结构类型兼容,仅名称不同。此时,组件的开发者可将该SQL过程抽象为一个SQL组件节点,将可变的输入表抽象为输入参数,可变的输出表抽象为输出参数,实现SQL代码的复用。

后续在使用SQL组件节点时,只需从代码组件列表中选择和自己的业务处理过程类似的组件,并为该组件配置自己业务中特定的输入表和输出表,无需再次编辑代码,便可直接生成新的SQL组件节点,极大提升了开发效率,避免重复开发。SQL组件节点生成后的发布、调度操作,与普通SQL节点的操作方式相同。

权限说明

您需具备DataWorks工作空间的开发权限,才可创建并使用组件。授权详情请参见添加空间成员并管理成员角色权限

使用限制

  • DataWorks标准版及以上版本,才可使用SQL组件节点功能。详情请参见DataWorks各版本详解

  • 本工作空间成员创建的组件在组件下。

  • 租户成员创建的组件在公共组件下。

组件类型

组件分为项目组件及公共组件,组件开发者(即创建组件的用户)在创建组件时可自行定义。

  • 项目组件:组件发布后,默认仅该DataWorks工作空间的用户均可使用。若您希望使用该类组件,则需成为此工作空间的成员,详情请参见添加空间成员并管理成员角色权限

  • 公共组件:组件的开发者可进入公开组件页签,将具有全局通用性的组件发布到整个租户内,发布后,租户内所有用户均可使用该公共组件。

组件使用流程

DataWorks中创建的组件需与DataWorksSQL组件节点配合使用,具体流程如下:

  1. 定义SQL组件

    组件开发者可通过数据开发(DataStudio)的组件管理界面,定义通用逻辑的过程体代码及输入输出参数,通过编写抽象的SQL加工过程,将指定的输入表通过输入参数进行加工处理,生成有业务价值的输出表(即输出参数)。代码中输入参数和输出参数的格式为@@{参数名}

    • 输入参数支持如下类型:

      • 表类型的参数:若加工表时,输出结果类别单一恒定,请使用该类型。

      • 字符串类型的参数:若加工表时,需通过变量控制输入参数的取值,请使用该类型。

    • 输出参数实际使用时请配置为表类型的参数。

  2. 引用SQL组件

    组件使用者需在数据开发界面,通过创建SQL组件节点引用所需组件,替换组件中的输入与输出参数,实现代码复用。

定义SQL组件

进入组件管理页面

  1. 进入数据开发页面。

    登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据开发与治理 > 数据开发,在下拉框中选择对应工作空间后单击进入数据开发

  2. 在左侧导航栏单击组件管理,进入组件管理页面。

    说明

    若左侧导航栏不存在组件管理,则可单击左下角的设置图标,根据模块管理自行添加。

创建并配置组件

以下为您介绍组件开发者如何通过组件管理新建组件,将指定的SQL过程抽象为一个SQL模板。一个组件通常由过程体、输入参数、输出参数组成。过程体用于定义组件功能的实现代码,在过程体中,通过@@{变量名}格式,将可变的输入表或输入字符串抽象为组件的输入参数,将可变的输出表抽象为组件的输出参数,实现SQL代码的复用。

说明

一个组件可配置多个输入参数和输出参数,具体请根据实际使用进行配置。

过程体

步骤一:创建组件

组件管理页面,您可通过如下方式创建组件并输入组件名称。创建组件

说明
  • 本工作空间成员创建的组件在组件下。

  • 租户成员创建的组件在公共组件下。

步骤二:配置组件信息

  1. 配置过程体。

    过程体即为组件的实现代码。通过编写抽象的SQL代码(即SQL加工过程),使用@@{参数名}格式,引入输入参数和输出参数,将指定的输入表通过输入参数进行加工处理,生成有业务价值的输出表。后续使用组件时,只需配置不同的输入参数和输出参数,便可通过该代码模板生成正确可运行的SQL代码。

  2. 配置输出参数。

    定义过程体的输入参数,支持TableString类型,即过程体的输入参数为某表或某字符串,具体如下。

    • Table:若使用组件加工源表数据时,输出结果类别单一恒定,则请使用该类型。

      该类型的主要配置说明如下。

      配置项

      描述

      配置示例

      参数定义

      用于将输入表的结构进行文本化呈现,其中可包含表的字段、字段类型及字段含义等内容。通过该形式,告知组件使用者,在使用组件时需为输入参数配置与输入表结构参数个数相同,类型兼容的输入表。防止配置的输入表和组件定义的输入表字段个数不一致、字段类型不兼容,导致组件运行时出错。

      说明

      该定义仅为参考,为您提供输出参数配置的帮助指示,并不会即时强制检查。

      参数定义的格式建议为:

      字段1名 字段1类型 字段1注释 
      字段2名 字段2类型 字段2注释 
      ……
      字段n名 字段n类型 字段n注释

      示例如下:

      area_id string ‘区域id’ 
      city_id string ‘城市id’ 
      order_amt double ‘订单金额’ 
    • String:若使用组件加工源表数据时,需通过变量控制输入参数的取值,则请使用该类型。

      该类型的主要配置说明如下。

      配置相关

      描述

      默认值

      该类型支持设置参数默认值,设置后,组件使用过程中默认使用所配置的参数默认值。

      场景示例

      • 场景一:组件过程的输出表需输出每个区域前N个城市的销售额,则可设置N为该组件的输入参数,N的取值可通过字符串类型参数进行控制。

      • 场景二:组件过程的输出表需输出省份的销售总额,可设置一个省份字符串参数作为该组件的输入参数,通过指定不同的省份,获取相应省份的销售数据。

  3. 配置输出参数。

    定义过程体的输出参数,即组件最终产出表。为便于组件使用者使用组件,您可在输出参数配置中,填写使用该组件后输出表的表结构,供组件使用者参考。

    输出参数的主要配置说明如下:

    配置项

    描述

    配置示例

    参数定义

    用于将输出表的结构进行文本化呈现,其中可包含表的字段、字段类型及字段含义等内容。通过该形式,告知组件使用者,在使用组件时需为输出参数配置与输出表结构参数个数相同,类型兼容的输出表。防止配置的输出表和组件定义的输出表字段个数不一致、字段类型不兼容,导致组件运行时出错。

    说明

    该定义仅为参考,为您提供输出参数配置的帮助指示,并不会即时强制检查。

    参数定义的格式建议为:

    字段1名 字段1类型 字段1注释 
    字段2名 字段2类型 字段2注释 
    ……
    字段n名 字段n类型 字段n注释

    除此之外,输出参数定义还可根据您所需的处理结果,添加汇总输出结果字段。例如,排名、总收入等。

    示例如下:

    area_id string ‘区域id’ 
    city_id string ‘城市id’ 
    order_amt double ‘订单金额’ 
    rank bigint ‘排名’

步骤三:保存并提交组件

单击保存图标,保存组件;单击提交图标,提交组件。组件创建完成后,可在SQL组件节点中引用,帮助您快速生成业务所需的目标表。使用详情请参见引用SQL组件

引用SQL组件

前提条件

引用组件

您需在已创建的SQL组件节点的编辑页面引用组件:image.png

  1. 选择所需引用的组件。

    如果没有可用组件,请参考定义SQL组件创建。

    • 若所选组件存在最新版本,您可根据业务需要选择是否更新代码版本,引用最新组件版本。

    • 单击打开组件即可查看组件详情。

  2. 根据实际使用配置组件参数值。

管理组件

分享及查看组件的引用记录

您可根据业务需要分享组件或查看组件的引用记录。分享及查看引用记录

  • 分享组件(序号1):组件发布后,默认为项目组件,即仅支持当前DataWorks工作空间的用户使用该组件。组件开发者可通过分享组件,将具有全局通用性的组件发布到整个租户内,分享组件并发布后,租户内所有用户均可使用该组件。

  • 查看组件的引用记录(序号2):可查看哪些节点引用了当前组件,用于进行组件变更时提前预估影响。

升级组件

升级操作:组件开发者

组件开发者可根据需要编辑组件代码及相关参数配置,编辑完成后保存提交即可升级为新版本组件,您可在区域3查看组件各个版本的详情。组件升级

组件版本的使用影响:组件使用者

组件升级后,若您的SQL组件节点引用了该组件,则引用时可选择是否使用该组件已升级的最新版本。若无需使用,则继续引用原有版本;若使用,需确认新版本组件对于SQL组件节点的参数配置是否继续生效,并根据新版本组件的说明进行相关调整,编辑完成后进行提交发布。提交发布流程同普通SQL节点相同。image.png

升级场景示例

组件开发者用户C创建了V1.0版本组件,用户A使用了该V1.0版本组件;随后,用户C将组件升级为V2.0版本。用户A在使用过程中发现该组件已存在最新版本V2.0,则可打开组件,查看不同版本详情,对比后发现新版本组件业务效果更好,则可更新升级到最新的组件版本使用。

后续步骤

当您完成当前节点的任务开发后,通常您可进行以下操作。

  • 调度配置:配置节点的周期性调度属性。任务需要周期性调度运行时,您需要设置节点后续实际运行过程中的重跑属性、调度依赖关系等,操作详情请参见任务调度属性配置概述

  • 任务调试:对当前节点的代码进行测试运行,确认代码逻辑符合预期,操作详情请参见任务调试流程

  • 任务发布:完成所有开发相关操作后,您需要将所有任务节点进行发布,发布后节点将根据调度配置结果进行周期性运行,操作详情请参见发布任务

更多参考

使用组件界面功能介绍

界面

序号

功能

说明

1

保存

保存当前组件的设置。

2

偷锁编辑

非组件责任人可以锁定编辑此节点。

3

提交

将当前组件提交到开发环境。

4

公开组件

将具有全局通用性的组件发布到整个租户内,所有租户的用户都能看到该公共组件并可使用。

5

输入输出参数解析

解析当前代码的输入输出参数。

说明

此处填写的参数通常为表名称,而非调度参数。

6

预编译

对当前组件的自定义参数、组件参数进行编辑。

7

运行

在本地(开发环境)运行组件。

8

停止运行

停止运行的组件。

9

格式化

对当前组件代码根据关键字格式排列。

10

参数配置

组件信息、输入参数、输出参数配置。

11

版本

组件提交发布的记录。

12

引用记录

汇总组件被引用的记录。

最佳实践

前提条件

步骤一:定义组件

您需先参考定义SQL组件创建get_top_n组件,组件配置详情如下。image.png

  • 组件参数配置

    参数分类

    参数名称

    参数类型

    参数描述

    参数定义

    输入参数

    myinputtable

    table

    指定的销售明细数据表。

    area_id string
    city_id string
    order_amt double
    rank bigint

    topn

    string

    取销售排行的前N名。

    不涉及

    输出参数

    myoutput

    table

    目标输出表,用于获取各个区域下指定前N名的城市排行。

    area_id string
    city_id string
    order_amt double
    rank bigint
  • 组件过程体定义

    INSERT OVERWRITE TABLE  @@{myoutput}  PARTITION (pt='${bizdate}')
     SELECT r3.area_id,
     r3.city_id,
     r3.order_amt,
     r3.rank
    from (
    SELECT
       area_id,
       city_id,
       rank,
       order_amt_1505468133993_sum as order_amt ,
       order_number_1505468133991_sum,
       profit_amt_1505468134000_sum
    FROM
       (SELECT
       area_id,
       city_id,
       ROW_NUMBER() OVER (PARTITION BY r1.area_id ORDER BY r1.order_amt_1505468133993_sum DESC) AS rank,
       order_amt_1505468133993_sum,
       order_number_1505468133991_sum,
       profit_amt_1505468134000_sum
    FROM
       (SELECT
       area AS area_id,
       city AS city_id,
       SUM(order_amt) AS order_amt_1505468133993_sum,
       SUM(order_number) AS order_number_1505468133991_sum,
       SUM(profit_amt) AS profit_amt_1505468134000_sum
    FROM
      @@{myinputtable}
    WHERE
       SUBSTR(pt, 1, 8) IN ( '${bizdate}' )
    GROUP BY
       area,
       city )
       r1 ) r2
    WHERE
       r2.rank >= 1 AND r2.rank <= @@{topn}
    ORDER BY
       area_id,
       rank limit 10000) r3;

步骤二:使用组件

您需参考引用SQL组件创建xc_引用组件_get_top_nSQL组件节点,引用步骤一创建的get_top_n组件,并配置相应的参数值,步骤如下图。image.png参数值说明如下:

  • 输入参数myinputtable:为该参数指定一个输入表company_sales_record,作为数据输入源。输入表的结构如下:

    company_sales_record

    CREATE TABLE IF NOT EXISTS company_sales_record
    (
        order_id         STRING COMMENT '订单编号(PK)',
        report_date      STRING COMMENT '订单日期',
        customer_name    STRING COMMENT '客户名称',
        order_level      STRING COMMENT '订单等级',
        order_number     DOUBLE COMMENT '订单数量',
        order_amt        DOUBLE COMMENT '订单金额',
        back_point       DOUBLE COMMENT '折扣点',
        shipping_type    STRING COMMENT '运输方式',
        profit_amt       DOUBLE COMMENT '利润金额',
        price            DOUBLE COMMENT '单价',
        shipping_cost    DOUBLE COMMENT '运输成本',
        area             STRING COMMENT '区域',
        province         STRING COMMENT '省份',
        city             STRING COMMENT '城市',
        product_type     STRING COMMENT '产品类型',
        product_sub_type STRING COMMENT '产品小类',
        product_name     STRING COMMENT '产品名称',
        product_box      STRING COMMENT '产品包箱',
        shipping_date    STRING COMMENT '运输日期'
    ) 
    COMMENT '销售数据的明细信息'
    PARTITIONED BY
    (
        pt               STRING
    )
    LIFECYCLE 365;
  • 输入参数topn:为该参数指定按照销售额正序排序,每个区域的城市排行取前多少名。示例取前10名。

  • 输出参数myoutput:为该参数指定加工输出的结果的表名称company_sales_top_n。输出表的结构如下:

    company_sales_top_n

    CREATE TABLE IF NOT EXISTS company_sales_top_n
    ( 
    area STRING COMMENT '区域', 
    city STRING COMMENT '城市', 
    sales_amount DOUBLE COMMENT '销售额', 
    rank BIGINT COMMENT '排名'
    )
    COMMENT '公司销售排行榜'
    PARTITIONED BY (pt STRING COMMENT '')
    LIFECYCLE 365;