我们在前面的文章中讨论了如何将数据接入到数据平台。一般而言,接入到数据平台的数据会来自众多的业务系统,这样一来,我们就拥有了大量不同来源的数据。如何将这些数据有效的管理起来是一个很大的挑战。本文将尝试结合我们的项目实践经验做一些分享。
(数据仓库可以理解为数据平台中所有数据的一个集合,所以,数据平台中的数据管理也可以说是数据仓库中的数据管理。下文中数据平台和数据仓库会经常交替使用,其意义基本一致。)
将数据管理起来是为了高效的查找和使用数据。我们先来看一下通常是如何使用数据的。
一个简单的指标计算
假设现在有一个大型零售行业的场景,我们的主要产品是空调。作为空调生产商,空调的销售主要是通过各大经销店完成的。现在我们想知道空调的销量情况用以辅助决策,我们可以开发一个指标来统计销量。
####开始
如何统计销量呢?看起来只需要把销售的订单找出来,做一个加和统计就可以了。但是实际情况会更复杂一些,从业务上讲,以下场景产生的订单不需要统计:
- 订单被取消
- 订单还在进行中
- 订单产生了退货
- 内部奖励产生的订单
- 翻新的产品产生的订单
这个时候我们的销量统计逻辑可以用SQL表达为:
(实际情况可能更复杂,因为order表可能没有是否翻新产品或者是否是内部奖励的信息,此时需要连接其他表进行查询。)
考虑取数时间
上述代码正确吗?我们需要注意,根据每天接入数据平台的数据来看,对于某一个订单,数据仓库里面的数据可能是重复的。比如,订单a在前天创建,同时在昨天被更新,这时,前天和昨天的数据里面都会有这个订单。根据这里的分析,我们需要取当前最新状态的订单来进行计算才行。上述的SQL需要改进为:
####考虑计算历史指标
此时,我们还会希望这个指标可以每天定时计算出来,然后通过大屏进行展示。这个需求就要更复杂一些了。我们常常需要一个任务调度系统来支持,以便可以将上述的代码每天跑一次。其实不仅仅是调度系统,为了支持决策,我们还常常有统计历史指标的需要,比如销量指标在上个月是多少,本月是增长了还是下降了?
这时,代码里面需要加入一个变量,那就是希望计算哪一天的指标。这个参数我们可以命名为data_date。上述代码可以进一步优化为:
考虑计算其他维度
这下看起来好像差不多了。但是,通常来讲,还有更多的来自业务方的需求,比如,希望可以根据经销店的维度来查看这个指标,以便对比分析。希望按照省、市、区维度来查看这个指标,以便对比分析。
此时我们需要考虑指标保存的粒度了。对于经销店粒度的指标而言,因为总的销量与各经销店的销量有汇总关系,所以这里可能没必要保存总销量。当需要总销量时,在展示的时候进行汇总加和即可。
对于省、市、区这几个维度而言,不难看出,它们存在层级关系:区以上是市,市以上是省。其实经销店与这三个地域维度也存在层级关系:经销店以上是区,区以上是市,市以上是省。所以,事实上,我们只需要保存到经销店粒度的统计数据就可以支持省、市、区维度的统计了。
于是我们可以修改代码为:
(实际情况可能更复杂,因为order表往往没有省、市、区的信息,此时需要连接其他表进行查询。)
调度运行
到这里,一个基本的指标计算算是搞定了。实际情况下,由于这个任务需要order等表的数据,需要在数据接入之后才能运行。我们会将这个计算任务和数据接入的任务组成一个数据处理管道(