每年年终或新年伊始,公司管理层都要从各个角度比如部门、产品线等考察公司过去一年的业绩,作为数据分析团队,你需要向管理层准备这样的数据分析报告,而在此过程中,你可能会面临着这样的问题:
*公司的组织架构在过去的一年中发生了调整,部分人员的所属部门也因此发生了变动,那各部门的业绩如何统计?
*由于业务优化,公司一些产品的分类发生了变更,那全年各产品分类的销售数字如何统计?
为了生成上述业绩报告,多维数据分析是最常用与高效的技术手段。通过多维建模,将员工业绩、产品销售定义为事实表,把员工、产品、日期等定义为维度表,从而方便高效的从各个维度对公司核心KPI进行汇总统计和对比分析,以下便是基于销售数据的一个简单多维分析模型示例。
图表1:一个简单的多维模型示例
事实表一般会每天更新,而维度表尽管基本稳定,但也会随着时间发生变化,比如产品的分类、客户的国家、员工的部门等,这就是多维数据分析中的缓慢变化维概念(SlowlyChangingDimension,SCD)。如何处理这个变化,回答本文开始的问题,需要根据查询分析的特定需求分别处理,业界称之为缓慢变化维度的处理。
缓慢变化维度的常见处理方法
一般来说,最为常见的缓慢变化维度的处理方法有类别1(Type1)和类别2(Type2),其具体处理方法和查询举例如下:
*类别1:维度表中直接覆盖原值,查询时只能使用最新的维度属性,反应维度最新状态(lateststatus);
*类别2:维度表中添加新的记录,通常增加有效期字段来区分,记录维度表所有历史变化,从而使得历史可追溯。在查询时一般使用当时的维度属性,反应历史事实(historicaltruth)。
以图表1的多维模型为例,假设产品iPhoneX在年双11后,分类从3C调整为了Mobile,以下分别是类别1和类别2对产品维度表的处理方法,以及在查询年各产品分类的销售数字时的结果:
图表2:缓慢变化维类别1和类别2的处理方法与查询结果示例
注:类别2的处理方法有各种具体实现方法,比如常见的拉链表,但基本原理一致。
讲到这里,相信各位已经对文章开头的问题已经有答案了,现在需要做的就是和业务方沟通,统一数据统计口径,然后在ETL或者数据仓库中具体实现。在一些复杂的场景中,还会使用到类别3和类别4,甚至是混合的处理方法,本文不在此进行深入讨论,具体内容各位可以参考相关文档。
Kyligence的缓慢变化维处理实践
在大数据场景下,为了加速数据分析的性能与并发,基于多维模型(Cube)进行预计算是最为行之有效的方法之一。开源顶级项目ApacheKylin便是其中代表,而基于它为核心的企业级大数据分析平台KyligenceEnterprise,更是实现了PB级数据的亚秒级查询响应和数以千计的高并发访问。
默认情形下ApacheKylin与KyligenceEnterprise对所有维度表均做类别2处理,每次Cube刷新时记录当时的维度表数据,以便在查询时使用并反应当时的历史事实。
启用缓慢变化维类别1
在默认情形下,当用户需要使用最新维度表信息统计结果时,即需要类别1处理方法时,就需要刷新所有Cube历史数据,这带来了大量额外的计算开销,在海量数据场景下无法接受。因此,KyligenceEnterprise从v3.2.2版本之后,内生支持缓慢变化维类别1,用户可以在定义模型时,通过简单的设置,即可对维度表启用缓慢变化维类别1处理,如下图:
图表3Kyligence支持缓慢变化维类别1处理
对于启用了缓慢变化维Type1的维度表,KyligenceEnterprise将仅保留一个最新版本,并在每次Cube数据刷新时更新该维度表,而在查询时,所有Cube历史数据(Segments)将与该最新的维度表联接并反馈查询结果,其原理如下图所示:
图表4Kyligence支持缓慢变化维类别1处理原理
总结
以上便是多维分析中缓慢变化维与常见处理方法的简单介绍,以及Kyligence与ApacheKylin在大数据场景下的实践。
在海量数据多维分析场景下,KyligenceEnterprise实现了灵活的缓慢变化维类别1和类别2的处理,既保障了查询性能,又避免了不必要的Cube数据刷新的开销,从而满足不同的数据分析需求,大幅提升大数据分析的效率。
未来Kyligence还会做更多探索与改进,比如类别1和类别2的灵活切换,支持更多缓慢变化维处理类型等,敬请期待。
更多详情,请参考Kyligence官方网站:
(