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

组件的定义

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

组件的价值

在实际业务实践中,有大量的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代码。

创建组件举例

通过点击下图框可新建组件。



原始表结构定义

销售数据的原始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_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;

组件的分享范围

组件的分享范围有两种:项目组件和公共组件。

组件发布后默认在本项目内其他用户可见可用。组件的开发者通过点击“公开组件”按钮可以将具有全局通用性的组件发布到 整个租户内,所有租户内的用户都能看到该公共组件并可使用。组件是否是公开组件取决于下列框内图标是否可见:



组件的使用

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

组件的引用记录

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