本文为您介绍组件的定义、构成以及如何创建组件。

组件的定义

组件是一种带有多个输入参数和输出参数的SQL代码过程模板,SQL代码过程的处理过程通常是引入1到多个源数据表,通过过滤、连接和聚合等操作,加工出新的业务需要的目标表。

组件的价值

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

在使用SQL组件节点时,您只需要从组件列表中选择和自己业务处理过程类似的组件,为这些组件配置上自己业务中特定的输入表和输出表,不用再重复复制代码,就可以直接生成新的组件SQL节点。从而极大提高了开发效率,避免了重复开发。SQL组件节点生成后的发布与调度的操作方法都和普通的SQL节点一样。

组件的构成

一个组件就像一个函数的定义一样,由输入参数、输出参数和组件代码过程构成。

组件的输入参数

组件的输入参数具有参数名、参数类型、参数描述和参数定义等属性,参数类型有表类型(table)和字符串类型(string)。

  • 表类型的参数:指定组件过程中要引用到的表,在使用组件时,组件的使用者可以为该参数填入其特定业务需要的表。
  • 字符串类型的参数:指定组件过程中需要变化的控制参数,例如指定过程的结果表只输出每个区域的头N个城市的销售额,这个n是1还是3就可以通过字符串类型的参数进行控制。

    例如指定过程的结果表要输出哪个省份的销售总额,可以设置一个省份字符串参数,指定不同的省份,即可获得指定省份的销售数据。

  • 参数描述:描述该参数在组件过程中发挥的作用。
  • 参数定义:只有表类型的参数才需要,是表结构的一个文本定义。用于指定组件的使用者需要为该参数提供一个和该表参数定义的名字一致并且类型兼容的输入表,组件过程才会正确运行。否则,组件过程运行时会因为找不到输入表中指定的字段名而报错。该输入表必须具有该表参数定义中指定的字段名和类型,顺序不限,有多余的其他字段也不禁止。参数定义仅为参考,为使用者提供帮助指示。
  • 表参数的定义格式建议为:
    字段1名 字段1类型 字段1注释 
    字段2名 字段2类型 字段2注释 
    字段n名 字段n类型 字段n注释
    示例如下:
    area_id string ‘区域id’ 
    city_id string ‘城市id’ 
    order_amt double ‘订单金额’

组件的输出参数

  • 组件的输出参数具有参数名、参数类型、参数描述和参数定义等属性,参数类型只有表类型(table),字符串类型的输出参数没有逻辑意义。
  • 表类型的参数:指定组件过程中最终产出的表。使用组件的,组件的使用者可以为该参数填入其特定业务下通过该组件过程要产出的结果表。
  • 参数描述:描述该参数在组件过程中发挥的作用。
  • 参数定义:是表结构的一个文本定义,用于指定组件的使用者应该为该参数提供一个和该表参数定义的数目一致、并且类型兼容的输出表,组件过程才会正确运行,否则运行的时候会因为字段个数不匹配或类型不兼容而报错。对于输出表的字段名,不要求和表参数定义的字段名必须一致。该定义仅为参考,为使用者提供帮助指示。
  • 表参数的定义格式建议为:
    字段1名 字段1类型 字段1注释 
    字段2名 字段2类型 字段2注释 
    字段n名 字段n类型 字段n注释
    示例如下:
    area_id string ‘区域id’ 
    city_id string ‘城市id’ 
    order_amt double ‘订单金额’ 
    rank bigint ‘排名’

组件的过程体

在过程体中参数的引用格式为:@@{参数名}。

过程体通过编写抽象的SQL加工过程,将指定的输入表按照输入参数进行控制加工出有业务价值的输出表。

组件过程的开发具有一定的技巧,组件过程的代码需要巧妙的利用输入参数和输出参数,使得组件过程能够在使用时填入不同的输入参数和输出参数,也能生成正确的可运行的SQL代码。

创建组件

  1. 登录DataWorks控制台,单击相应工作空间后的进入数据开发
  2. 单击左侧菜单栏中组件管理
  3. 右键单击组件管理或组件管理下的文件夹,选择新建节点 > 组件
    组件
  4. 新建组件对话框中,填写组件名称描述,并选择目标文件夹
    目标文件夹
  5. 配置完成后,单击提交

原始表结构定义

销售数据的原始MySQL结构定义如下:
字段名称 字段类型 字段描述
order_id varchar 订单编号
report_date datetime 订单日期
customer_name varchar 客户名称
order_level varchar 订单等级
order_number double 订单数量
order_amt double 订单金额
back_point double 折扣点
shipping_type varchar 运输方式
profit_amt double 利润金额
price double 单价
shipping_cost double 运输成本
area varchar 区域
province varchar 省份
city varchar 城市
product_type varchar 产品类型
product_sub_type varchar 产品小类
product_name varchar 产品名称
product_box varchar 产品包箱
shipping_date datetime 运输日期

组件的业务含义

组件的名字:get_top_n

通过指定的销售明细数据表作为输入参数(表类型)和取前多少名作为输入参数(字符串),按照城市销售总额的大小作为排名依据。通过该组件过程,组件的使用者可以轻松获取到各个区域下,指定的前多少名的城市排行。

组件的参数定义

输入参数1

  • 参数名:myinputtable
  • 类型:table

输入参数2

  • 参数名:topn
  • 类型:string

输出参数3

  • 参数名:myoutput
  • 类型:table

参数定义:

area_id string

city_id string

order_amt double

rank bigint

建表语句,如下所示:

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;

定义组件过程体

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_150546813****_sum,
    profit_amt_15054681****_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_15054681****_sum, 
    order_number_15054681****sum,
    profit_amt_1505468****_sum
FROM     
    (SELECT area AS area_id,
     city AS city_id,
     SUM(order_amt) AS order_amt_1505468****_sum,
     SUM(order_number) AS order_number_15054681****_sum,
     SUM(profit_amt) AS profit_amt_1505468****_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;

组件的分享范围

组件的分享范围包括组件公共组件

组件发布后默认在本工作空间内的其它用户可见可用。组件的开发者通过单击公开组件,即可将具有全局通用性的组件发布到整个租户内,所有租户内的用户都能看到该公共组件并可以进行使用。

您可以通过查看下图中的公开组件图标是否可编辑,确认组件是否为公开组件。
公开组件

使用组件

组件开发完成后的使用请参见使用组件

组件的引用记录

打开相应的组件,单击右侧的引用记录,组件的开发者可以查看该组件的引用记录。
引用记录