最佳实践:SQL组件

本文以查询某区域内各城市的销售总额排行为例,为您介绍组件的使用。

前提条件

步骤一:定义组件

您需先参考定义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,作为数据输入源。输入表的结构请参见创建销售明细数据表

  • 输入参数topn:为该参数指定按照销售额正序排序,每个区域的城市排行取前多少名。示例取前10名。

  • 输出参数myoutput:为该参数指定加工输出的结果的表名称company_sales_top_n。输出表的结构请参见创建目标输出表

后续步骤

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

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

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

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

附录:表结构说明

您需在ODPS SQL节点中创建销售明细数据表和目标输出表,详情请参见开发ODPS SQL任务

创建销售明细数据表

销售明细数据表的建表语句如下:

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;

创建目标输出表

您需创建存放输出结果的目标表,建表语句如下:

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;