Skip to main content

数据模型

数据模型作为指标元数据的一部分,为上层指标开发提供数据基础,基于现有的数据模型,开发原子指标时,用户无需调研底层数据关系,直接通过可视化的页面即可配置生成指标,统一了指标数据来源的同时,也降低了指标开发的技术门槛。

通俗地形容,在指标平台里,数据模型提供了最基础的事实表和维表之间的基本关系,方便后续创建指标时,直接基于已经固化好的数据关系进行开发。

下面将具体介绍一下数据模型的相关的原理以及操作方式。

模型分类

目前数据模型主要采用向导式的配置方式,围绕着维度建模的核心理论,支持常见的单例模型、星型模型和雪花模型:

  • 单例模型:单张事实表组成的模型;
  • 星型模型:一张事实表,加上一个或多个维度表,事实表和维度表之间通过主键外键相关联,且维度表之间没有关联,从形状上看就像很多星星围着一个星星一样,所以叫星型模型;
  • 雪花模型:将星型模型中的某些维度再进一步进行规范,抽取成更细的维度表,让维度表之间也进行关联,那么这个时候,即为雪花模型;

model1

tip

建设过程中,一般会尽可能地避免雪花模型,更多地采用拍平的星型模型。

组成要素

对于指标平台来说,数据模型包括表、关系、度量、维度四大组成要素:

  • 表:主要以一张事实表和一张或者多张维度表的形式存在,不同类型的表后续计算指标时取数的逻辑会有所不同,具体见下节【表类型】的说明;
  • 关系:不管是星型模型还是雪花模型,都会包含多张表,且表之间通过固定的关系形成一个稳定完整的模型;
  • 度量:度量列,一个度量对应一个字段,作为后面原子指标的统计来源;
  • 维度:维度列,一个维度对应一个字段,作为后面指标统计的维度来源。
note

基于实际业务情况建立的稳定标准的数据模型,为后续原子指标创建提供便利的同时,也能够规范化指标整体的数据链路,故数据模型稳定后,一般不建议去频繁地更改。

表类型

关于数据模型中表类型的配置,包括普通表、分区表、拉链表三种类型的表,因为数据模型是为后续指标开发提供直接的数据计算来源,而为了保证指标计算结果的准确性,针对不同类型的表,所取的数据范围均有所不同,这边详细说明平台针对三种类型的表各自对应的处理方式:

  1. 普通表:说明表里的数据没有时间有效性要求,不管计算什么内容,平台都会取全表的数据作为基础;
  2. 分区表:分区表作为数据库存储数据的一种方式,又可以根据实际业务内容分为增量分区表和全量分区表。
    • 增量分区表:不会限制数据范围,数据更新时,每次计算选取全部分区的数据作为指标计算的数据来源
    • 全量分区表:数据更新时,每次根据分区字段选取对应一个时间分区内的数据作为计算来源
  3. 拉链表:和分区表一样,相当于表的一种存储方式,它维护了最新状态数据的同时,也维护了历史状态数据,和时间分区一样,相当于做了历史数据留存,但是同时又做了优化,去除了没有变更的数据,既满足了查询数据的历史状态的需求,又节省了存储资源,总的来说拉链表记录了一个事物从开始,一直到当前状态的所有变化的信息。
note

4.3.0版本中不包括拉链表

模型sql脚本

模型的sql主体主要是‘select from’的形式,其中:

  • select后的字段为模型中选择的度量列和维度列对应的字段;
  • from后面跟的为模型的主表加上各自的关联表;

模型加工

进入「数据模型」列表,点击「新建模型」即可进入新建模型页面。

设置基础信息

设置模型基本信息,包括模型名称、模型编码、备注。

note

针对Trino引擎,这一步骤还需要确定后续加工的指标是否必须通过平台落表。指标数据由平台生成开启后,则指标统一由平台落表,可使用行更新功能,否则,平台不限制落表方式,但不可使用行更新功能。

表关联

模型表可选择表、视图生成模型,表之间可通过left join/right join/inner join进行关联。 单个表/视图需要设置的具体信息规则如下:

  • 更新方式:选择增量分区表、非分区表时,模型SQL不会做特殊处理;选择全量分区表时,模型SQL会增加where条件,筛选出业务日期分区内的数据进行后续指标计算;选择拉链表时,模型SQL会增加where条件,筛选出开始、结束时间范围内的有效数据进行后续指标计算。
  • 行更新:行更新应用于对历史数据做部分行更新后,指标结果表需要针对受影响的行进行局部更新的场景。系统目前支持对hudi数据源设置需要行更新,需要进行行更新的模型,落表的模型及其后续生成的指标结果表均会保存为hudi格式的数据,以便行更新过程可以进行数据追溯。
  • 删除字段、删除取值、未删除取值:对于需要进行行更新的表,需要指定删除字段,系统将根据删除字段判断数据有效性。系统目前仅支持自定删除字段、未删除字段
info

行更新功能仅旗舰版支持。

note
  1. 存储为hudi的数据将通过spark进行读写操作,spark目前仅支持读spark视图,此时若模型使用到了视图,请选择通过指标共享模块功能通过数据共享生成的spark视图(其他方式生成的spark视图也可)。
  2. 同一张表在整个集群的更新方式、行更新状态需保证唯一,对于已经设置过相关字段的表,若想修改设置内容,请先删除相关模型的该表,再到「数据源管理」模块删除该表的定义后,再在需要的模型中重新设置。
  3. 若模型中有表选择需要行更新,后续指标将存储为hudi表,会通过spark进行读写操作,若模型中的表都不需要行更新,后续指标将存储为hive表,会通过trino进行读写操作。

选择维度

模型设置的维度是后续指标加工过程中用到的所有维度的汇总,此处请选择时间维度、业务维度两类内容。时间维度将用于派生指标的统计周期设置,业务维度将用于后续派生、复合维度设置。同一模型下的维度信息设置不可重复。

tip

为了保证后续加工指标可以充分、灵活选择聚合维度,模型定义维度时,一般需要尽可能根据实际的业务场景,把需要分析的维度都考虑进去。

选择度量

度量用于后续原子指标加工过程中的公式快速设置,请至少选择一个度量。

设置

模型支持两种存储方式:逻辑关系存储、物理表存储。若选择逻辑关系存储,系统将仅保存模型生成的SQL,后续指标加工时,将在模型SQL基础上进行二次加工生成指标SQL。若选择物理表存储,系统将以主表定义的时间为单位进行分区数据计算与存储,后续指标加工将依赖该模型结果表进行计算,以提高加工效率。存储为逻辑关系的模型只设置上游依赖即可,方便后续指标加工时自动添加上游依赖,保障任务有序运行。存储为物理表的模型需设置「调度属性」、「依赖属性」、「其他属性」三部分内容。各项参数设置规则如下:

调度属性

  1. 调度类型:周期性调度
  2. 出错重试:即任务执行失败的重试机制设置,默认不勾选即不重试,勾选后设置重试次数和每次重试间隔的时间
  3. 调度周期:目前包括「天」、「周」、「月」三种类型,如果选择了「天」,则表示此任务是每天执行一次
调度周期参数设置
天调度任务,表示此调度任务是每天自动执行一次,选择之后需要配置「具体时间」,即任务固定的执行时间: 1.格式:精确到分钟,默认00:00 2.值域:00:00到23:59
周调度任务,表示每周特定几天的特定时间点自动执行一次,选择之后需要配置「选择时间」和「具体时间」: 1.选择时间:下拉多选,星期一星期天 一共7个选项 2.具体时间:执行的具体时间点,同「天」调度
月调度任务,表示每月特定几天的特定时间点自动执行一次,选择之后需要配置「选择时间」和「具体时间」: 1.选择时间:下拉多选,每月1号每月31号 一共31个选项 2.具体时间:执行的具体时间点,同「天」调度
tip

针对源表数据量较大或者一些比较重要的指标,建议设置出错重试,保证任务运行的稳定性。

tip

在设置调度周期的时间时,建议考虑一下当前模型的上游数据同步情况,尽可能地避免过早执行导致计算结果不正确的情况。

依赖属性

任务依赖关系包含两类:任务之间的上下游依赖任务自身前后跨周期调度依赖

  • 任务之间的上下游依赖:支持进行离线任务和指标任务间的依赖关系配置和跨租户/跨产品/跨项目的其他调度任务的依赖关系配置。如:表B必须在表A计算完成后才能开始计算,即表A是表B的上游表,这时候通过依赖属性的配置。配置步骤如下:

    1. 点击「添加依赖」按钮进行上游依赖任务选择;
    2. 选择任务所属租户:选项范围为当前登录用户有租户权限的租户集合,默认填充当前租户;
    3. 选择任务所属产品:指标管理或离线开发,默认填充指标管理;
    4. 选择任务所属项目:基于选择的租户、产品,选项范围为当前登录用户有项目权限的项目集合,默认填充当前项目;
    5. 选择任务:基于选择的租户、产品、项目,选项范围为除指标血缘关联的上游指标所在任务外的其他任务,每次可选一个任务,若要依赖多个,请多次添加。平台会自动根据上游指标,找到其对应的指标任务,在【运维中心】模块中实现上下游任务的依赖关系。
  • 任务自身前后跨周期调度依赖:包括如下五个选项,其中,任务结束包括成功、失败、取消3种情况。

    • 不依赖上一调度周期:不依赖其他周期
    • 自依赖,等待上一调度周期成功,才能继续运行:等待当前指标对应的指标任务,每次执行前都要等他上一次的周期运行成功,比如一个每天5点跑的任务,1号的5点的周期实例跑失败了,这时候2号5点的周期实例也不用跑了
    • 自依赖,等待上一调度周期结束,才能继续运行:区别与上一个选项,只要运行结束即可,不管是成功、失败、还是取消,只要不是正在运行即可
    • 等待下游任务的上一周期成功,才能继续运行:等待当前指标任务的所有下游任务上一周期运行成功,如果当前指标任务下游有5个任务,就要等这5个都运行成功,一个没成功都不行
    • 等待下游任务的上一周期结束,才能继续运行:区别与上一个选项,只要运行结束即可
tip

因spark暂不支持hudi并发写入,若模型中存在需要行更新的表,该模型后续生成的所有表将只能选择自依赖相关选项

其他属性

包括「优先级参数」和「数据生命周期设置」

  1. 优先级参数: 手动设置指标任务优先级,值越小,优先级越高,数值范围1-100,默认1,设置了任务优先级后,可能不容易观察到效果,原因是优先级的判断是弱于任务的计划时间和上下游依赖的,只有在大量任务同时满足了计划时间+上下游依赖的前提下(即满足提交至引擎的条件),任务会大量堆积的时候,优先级参数才会体现较为明显的效果。
  2. 数据生命周期设置: 默认9999天,系统将根据设置的周期自动清空周期范围外的数据

调度信息配置完成后,支持点击「预览SQL」,在线查看调度任务的sql脚本,主要是基于模型技术信息的配置,自动生成包括 创建表、插入表 语句在内的完整的任务脚本,然后结合调度信息,待模型发布后,提交至运维中心执行任务,调度任务后续的执行维护具体见运维中心