Hologres开发规范

本文将为您介绍,Hologres在开发过程中的相关规范,帮助您快速了解Hologres的开发要求,避免进行错误的操作。

数据域规范

  • 数仓分层

    数据仓库以分层建设为主包含如下几类分层,其中CDM包含DWD、DWS、DIM。在Hologres中通过Schema隔离不同的分层。

    • ODS(Operational Data Store):操作数据层

    • CDM(Common Data Model):公共维度模型层

      • DWD(Data Warehouse Detail):明细数据层

      • DWS(Data Warehouse Summary):汇总数据层

      • DIM(Dimension):维度数据层

    • ADS(Application Data Service):应用数据层

    不同公司可根据业务的复杂程度选择适当的颗粒度,如一个公司存在多个BU(Business Unit),则以BU缩写作为Schema的前缀。

    create schema ${bu}_ads;
    create schema ${bu}_ads_dev;
    create schema ${bu}_dwd;
    create schema ${bu}_dwd_dev;
    create schema ${bu}_dws;
    create schema ${bu}_dws_dev;
    create schema ${bu}_dim;
    create schema ${bu}_dim_dev;
    create schema ${bu}_ods;
    create schema ${bu}_ods_dev;
  • 数据域缩写

    不同的数据域需要定义共享的数据域代码,形成公司共识规范。示例如下。

    数据域的名称

    数据域对应的缩写示例

    交易域

    trd

    商品域

    itm

    日志域

    log

    会员和店铺域

    mbr

    供销存管理域

    dst

    销售和客服域

    crm

    信用和风控域

    rsk

    工具和服务域

    tls

    物流和快递域

    lgt

命名规范

  • 任务命名规范

    任务命令时要区分内部任务还是同步任务,命名规则如下。

    • 内部SQL任务(非同步任务):holo_{target_table_name} (与外部表任务区分)。

    • 数据导入Hologres:{source}2holo_{target_table_name}

    • Hologres数据导出:holo2{target}_{target_table_name}

  • 表命名规范

    分层名称

    当前分层中表的命名规则

    示例

    DWD

    ${bu}_dwd.数据域_业务过程_[自定义词根]_后缀

    taobao_dwd.trd_ord_flow

    DWS

    ${bu}_dws.数据域_数据粒度缩写_业务过程_[{自定义词根}]_统计时间周期

    taobao_dws.trd_all_dtr,taobao_dws.log_slr_pv_dtr

    DIM

    ${bu}_dim.{维度定义}[_{自定义词根}]

    taobao_cdm.dim_itm

    ADS

    ${bu}_ads.业务域_维度_[{自定义词根}]_{刷新周期标识}

    说明

    刷新周期标识如下。

    • d:按天刷新。

    • r:实时刷新。

    • h:准实时刷新。

    taobao_ads.trd_cate_d

  • Table Group命名规范

    若是业务需要创建多个Table Group,命名可以采取${bu}_{数仓分层名}_{业务定义}_tg的规范。

  • 视图命名规范

    持久化视图命名规则与示例如下。

    • 规则

      • DWS:${bu}_dws.数据域_数据粒度缩写_业务过程_[{自定义词根}]_统计时间周期_v

      • ADS:${bu}_ads.业务域_维度_[{自定义词根}]_{刷新周期标识}_v

    • 示例

      taobao_dws.trd_byr_itm_ord_cm_v
  • 外表命名规范

    在原有MaxCompute表名基础下加ext后缀,具体示例如下。

    taobao_dim.camp_ext
  • 临时表命名规范

    在原有表名基础下加tmp前缀及数字序号后缀,具体示例如下。

    taobao_dim.tmp_camp_01
  • 常用缩写词

    统计周期

    缩写

    最近一天

    1d

    最近多天

    nd

    累计

    td

    自然周

    cw

    自然月

    cm

    截止当前累计

    dtr

    截止当前小时累计

    dhr

表开发规范

  • 内表规范

    创建表之前必须按照数据模型规范确定表和字段的命名,并根据需求确认表的生命周期,为表和字段添加完整注释,相关规范如下。

    • 强控规范(如不符合则不允许发布):

      • 输出的表与字段需包含Comment,适用于全平台数据研发操作场景,表的Comment应确保描述信息简练、清晰。

      • 建表语句中需包含有表的生命周期(time_to_live_in_seconds)。

      • 建表语句需带有分布键索引(distribute_key),分布键选择原则如下。

        足够分散、最常JOIN或者GROUP BY的字段。例如买家商品表,可以设置user_iditem_id,但如果常关联的KEY为user_id,则分布键设置user_id而非user_iditem_id

      • 进行关联查询的表需要创建在同一个Table Group中。

      • 同一个实体ID,在所有事实表和维表中保持名称和数据类型一致,比如交易表中用户ID为user_id,在维表中也为user_id,而不能是uid,同时数据类型保持一致,减少数据类型的转换。

      • 所有物理表的分区字段默认使用ds表示。

    • 建议规范:

      • 建表语句应当带有bitmap_columnssegment_keycluster_key任意之一。

      • 在不明确字段基数情况下,不建议设置建表属性dictionary_encoding_columns(字典索引),您可调用如下内容将属性置空。

        call set_table_property('table_name', 'dictionary_encoding_columns','')
      • 建表属性orientation(数据存储格式)建议使用column,可以设置为row

        说明

        除非明确该表的查询能够始终指定所有的primary key(等于或者in),否则尽量不要使用row,不设置时默认是用column存储。

      • 建表属性bitmap_columns(比特编码),bitmap可以对存储文件内部的数据进行快速过滤。

        • 建议把filter条件的数据建成bitmap_columns,默认情况下会将所有的TEXT字段设置。

        • 不建议枚举值过多的字段,比如user_id,建议活动ID这类指标设置为bitmap_columns

      • 建表属性event_time_column需用在与实时写入有关的字段上,例如事件时间戳。

      • 建表属性clustering_key聚簇索引,Hologres会在聚簇索引上对数据进行排序,建立聚簇索引能够加速在索引列上的rangefilter查询,仅能设置一组。对于范围过滤适用,比如gmv分档时。

  • MaxCompute外表规范

    Hologres支持通过外表对MaxCompute进行加速查询,可简化数据同步的流程。为了提升计算性能,非必要场景不建议您使用内表与外表关联。为更好地管理和维护外表,请遵循如下规范。

    • 强控规范:您需严格按照外表命名规范,在原有的MaxCompute表名基础下增加ext后缀。

    • 建议规范:

      • 保留外表的DDL,做好版本之间的管理。

      • 不建议内表与外表关联使用,建议采用外表同步至内表的方式。

  • 视图规范

    • 强控规范:您需严格按照视图命名规范。

    • 建议规范:

      • 建议您开启任务调度,保障后续开发作业依赖链路完整。

      • 建议不同粒度的视图单独创建,避免综合请求计算量过大。

        例如,cw、cm、nd、1d等,可分别建立4个视图。如存在分端,则建立pc、wap、app。如分采集方式,可以分ut和非ut。

  • 生命周期(仅限内表)规范

    数仓分层

    对应的生命周期规则描述

    DWD

    天级增量明细,建议不超过2年。

    DWS

    天级增量明细,建议不超过2年。

    DIM

    大维表建议进行极限存储建模后永久保存,小维表与MaxCompute表保持一致。

    大、小维表的界定标准:单分区不可超过1 TB。

    建议规范:

    若是有分区表,建议按照实时任务写入当天分区,并且按照数仓分层设置合适的TTL,且更新的历史数据不应该写入已经超过TTL设置的分区。

  • Table Group规范(可选)

    每个数据库都会有默认的Table Group和Shard数,您可以根据业务需要新建Table Group或者修改Shard数,以此达到更好的性能,建议规范如下。

    • 如无必要不要新建Table Group。

    • 数据量较大的表,可独立新建Shard数较大的Table Group。

    • 有大量数据量较小的表,可适当创建一个Shard数较小的Table Group。

    • 需要Join关联查询的表,必须放在同一个Table Group。

字段开发规范

  • 字段类型规范

    字段类型需严格按照如下要求进行创建。

    字段/字段后缀

    字段注释

    示例

    缩写

    user_id

    自增会员ID

    user_id=232442843

    int8

    item_id

    商品ID

    item_id=63283278784383

    int8

    member_id

    注册会员ID

    member_id=b2b-dsajk2343821b

    TEXT

    *amt*

    金额类

    pay_ord_amt_1d_001=923.23

    NUMERIC

    *fee*

    费用类

    post_fee=923.23

    NUMERIC

    *cnt*

    数量类

    pay_ord_byr_cnt_1d_001=923

    int4/int8

    is_*

    是否类

    is_pm=Y/is_pm=true

    TEXT/BOOL

    ds

    分区

    ds=20210120

    YYYYMMDD

  • 基本数据类型参考

    目前,Hologres数据类型与PostgreSQL数据类型兼容,但支持的数据类型是PostgreSQL的一个子集。详细字段类型及MaxCompute映射,请参见数据类型汇总

  • 货币单位及精度

    中国内地地域货币单位统一为人民币,其他地域货币单位统一为美元。除非模型有特殊说明,否则金额相关的数据不做任何四舍五入操作,以免后续汇总计算中造成不同口径的汇总结果不一致。

SQL规范

  • 强控规范:

    • SQL最外层及子查询内层不需要计算的字段禁止使用select *操作,所有操作必须明确指定列名。

    • Where条件中空字段和空字符串要进行必要的Coalesce处理。

  • 建议规范:

    • 常采用count distinct字段作为distribution_key,对于多个count distinct的组合需要手动的改写。

      select count(distinct userid)
           , count(distinct case when stat_date = '20201111' then userid end) 
      from t group by cate_id;
      
      --改写为如下
      select count(1), sum(c) from 
      (
        select userid
             , cate_id
             , cast(count(case when stat_date = '20201111' then 1 end) > 0) as c 
        from t 
        group by cate_id, userid
      ) t1 
      group by cate_id;
    • 离线调度任务增加analyze table操作分区表。

    • 针对长周期使用场景,批操作时采用ATTACH/DETACH操作历史分区,避免数据指标大起大落。