3.4 高级结构整理:数据聚合
3.4.1 聚合的必要性和用法——单一层次聚合
如果要选一个Prep Builder远胜于Desktop的功能,笔者愿意把这个殊荣授予“数据聚合”(Aggregate)。前面我们说,数据分析的关键是分析问题所在的数据层次,并将其聚合。这个过程在Desktop中是通过日期层次和度量聚合来完成的,所有的聚合默认是从数据库明细数据汇总而来的。聚合是分析的基本过程。
不过,如果要定期给CEO展示不同品类和总公司的销售汇总,假设每次都从千万甚至过亿行的数据中聚合,则会给数据库带来过大的压力。Desktop通过设置数据提取以及增量刷新,尽可能减少数据库计算的次数,提高访问性能。但如果要在很多个分析场景中反复使用数据聚合,那又该怎么办呢?
此时我们就应该求助Prep Builder。作为敏捷ETL工具,Prep Builder可以随时创建“指定数据层次的聚合”,按需创建、修改灵活、引用方便、支持提取,因此可以大幅度提高数据的利用效率、减轻数据库的计算压力。由于一个流程可以生成无数个不同层次的流程分支,Prep Builder甚至可以承担部分数据仓库的功能。
聚合的背后是层次,因此创建聚合时务必清晰计算数据的层次。在这里,沿用超市数据中的“所有订单”,在以下层次做聚合:“类别、子类别、细分、每月的销售额、利润和数量”。其操作步骤如下。
第一步,创建“聚合”节点。
将鼠标光标放在前一个节点之后,点击“+”按钮,在下拉菜单中选择“聚合”命令,如图3-28所示。
图3-28 在Prep Builder中创建聚合节点
第二步,设置聚合字段。
如图3-29所示,把聚合需求中的维度字段和度量字段分别拖曳到“分组字段”和“聚合字段”区域,维度会展开为分组,度量则在维度确定的层次中自动聚合。
图3-29 在Prep Builder中创建聚合
正如第2章所讲,聚合的目的是为了特定层次的问题答案,问题的层次是由维度字段决定的,而答案的多少是由度量的聚合回答的;二者分别对应图3-29中“分组字段”和“聚合字段”的位置。当然,此处的“分组字段”翻译为“分类字段”会更加贴切。
第三步,调整日期的层次。
聚合中的关键维度是日期。由于日期是自带层次结构、自带连续性的维度,因此可以通过设置快速更改在时间上的聚合层次。注意图3-29中底部的“订单日期”,日期作为维度字段,默认是按照最低的层次聚合的,即显示每天的销售额、利润和数量,共计有1407个日期。
要分析“每月的销售额、利润和数量”,应该把一个月内的所有日期累加在一起。可以借助“分组”功能调整日期的层次。如图3-30所示,点击日期字段的“分组”,在“按级别分组”中选择“月开始时间”,也就是把每个月内的所有日期都累加到当月。在第8章讲解日期函数时,会特别说明这个选项背后的日期函数——DATETRUNC。由于月的日期层次比之前聚合度更高,因此原来1407个唯一的日期就变成了48个唯一值,图3-30中右侧的日期分层结构展示了这个过程的原理。
图3-30 Prep Builder聚合:更改日期的聚合层次
至此,Prep Builder的聚合节点就完成了“类别、子类别、细分、每月的销售额、利润和数量”的聚合数据,这个数据比数据库的明细数据要少很多,有助于加速以此数据为数据源的视图分析。
层次和聚合是数据分析最关键的基础、最核心的原理。初学者可能对Prep Builder完成聚合认识模糊,可以在阅读第5章之后重新体会Prep Builder的聚合过程。
对于高级用户而言,仅仅指定层次完成聚合还是不够的,往往还需要在明细的级别完成指定层次的聚合,从高级计算的角度,相当于在明细级别增加了额外层次的聚合,Desktop中使用FIXED LOD表达式完成。Prep Builder 2020.1版本最重要的更新,应该是FIXED LOD表达式,有助于高级用户,特别是IT用户在数据源层面为业务分析师提供更加稳定的数据模型。
3.4.2 FIXED LOD——独立层次聚合
Fixed是“指定”之意,LOD是详细级别、层次,FIXED LOD表达式本质是独立于当前视图层次的指定层次的聚合,即Aggregation on FIXED LOD。它和前面的“聚合”有什么区别呢?
简单地说,前面的“聚合”是指定一个层次完成聚合,这个层次就是聚合结果的层次。而FIXED LOD聚合,是在当前详细级别之上增加一个额外的层次完成聚合,这里的其他层次,是相对当前数据明细级别而言的,即Aggregation on fixed external LOD。总的而言,3.4.1节的“聚合”实现的是单一层次的聚合,这里的FIXED LOD实现了多个层次的数据分别聚合。初学者在学习第10章LOD表达式之后,会更加深刻地理解这个过程。如果能提前理解这个功能,也就有助于理解后面的层次分析。
比如在商品交易为明细级别的超市数据中,我们想计算每个用户的首次购买日期。可以假想在Excel的明细中增加一个辅助列,不管这个客户购买过多少次,辅助列都显示它的首次购买日期。借助第10章的方法,在Desktop中的计算逻辑如图3-31所示。
图3-31 Desktop中使用FIXED LOD完成指定层次的聚合
如图3-31所示,使用Desktop在视图详细级别(商品)中增加另一个完全独立的详细级别(客户)的聚合,此类计算只能通过FIXED LOD表达式来实现。不过LOD计算语法虽然简洁,但对于业务人员而言稍显晦涩。
在此,本书先介绍在没有FIXED LOD之前如何通过“聚合+连接”的方式实现这个过程,明白逻辑之后,再向FIXED LOD的聚合方式过渡。
第一步,首先使用“聚合”功能“在客户的层次,计算订单日期的最小值”。
过程与3.4.1节基本一致。如图3-32所示,先添加“聚合”节点,再双击加入“客户ID”节点。唯一的不同是,这里的聚合是对维度字段日期的聚合,最佳的方式是找到“订单日期”,点击“分组”按钮,在下拉菜单中选择“最小值”命令,订单日期的最小值就自动加入“聚合字段”区域。从而返回每个客户的首次订单日期。
图3-32 Prep使用聚合计算每个客户的订单日期的最小值
第二步,将聚合结果和之前的原数据连接(Join)起来。
连接的目的是把每位客户的首次订单日期,添加到之前的数据明细中,这个过程类似使用Excel中的VLOOKUP函数查找匹配客户ID,并返回“订单日期最大值”。如图3-33所示,拖曳“聚合”节点到“商品交易数据”节点,不同位置会出现不同的提示,放在右侧即“连接”(联接),释放鼠标就自动建立一个新的节点。
图3-33 聚合和前一个流程建立连接(子节点与父节点相连)
自动建立连接之后会弹出连接设置界面。如图3-34所示,数据连接会自动匹配相同的“客户ID”字段,由于两个数据中的客户ID完全一致,因此内连接就等于外连接。通过这种子节点与父节点相连的操作,就将聚合生成的结果附加到了此前的元数据中。
图3-34 通过先聚合在连接实现两个层次的数据合并
有了神奇的FIXED LOD,一切在瞬间都变得简单了。
直接在“商品交易数据”的节点中创建计算字段,即可指定客户完成首次订单日期的聚合。熟悉计算的读者可以完全手动创建,初学者不妨按照官方的引导,如图3-35所示,找到“客户ID”字段,点击右侧的“…”按钮,选择“创建计算字段→固定LOD”命令。
图3-35 使用Prep Builder创建FIXED LOD
FIXED LOD的设置界面非常友好,如图3-36所示,“客户ID”决定层次,是分组依据(分类字段);而选择“订单日期”作为聚合的依据,选择最小值(MIN)。时间用坐标轴坐标,分别点击两侧即可快速拾取最小值和最大值。创建完成后,左侧历史记录中的表达式与第10章中的FIXED LOD语法完全一致。
图3-36 Prep Builder中FIXED LOD的设置界面
读者在学习第10章“狭义LOD表达式”,特别是“会员分析RFM指标”之后,不妨重读这个部分,使用“固定LOD”(FIXED LOD)功能,可以轻松完成会员分析的RFM指标,从而简化会员分析模型。如图3-37所示,使用FIXED LOD添加每位客户的累计购买金额,还可以选择多种聚合方式。
图3-37 使用Prep Builder完成会员的累计销售额聚合
FIXED LOD最主要的用法,是把生成的结果用于创建视图的维度——比如客户的RFM分析。应该谨慎将FIXED LOD的结果在Desktop中作为度量,这样会使数据重复,极容易出错,度量计算应该在Desktop中使用表计算或者LOD表达式完成。
当然,这里的“固定LOD”的翻译过于生硬,因此上面笔者保留了Desktop中“FIXED LOD”的名称,如果一定要翻译,则“指定LOD计算”或者“指定层次计算”也许更加恰当一些。
3.4.3 Prep Builder聚合的注意事项
在使用Prep Builder聚合时,有一些地方需要特别注意。
(1)只有维度才决定详细级别,因此只有维度才能加入“分组字段”区域。虽然,在技术上,度量也能加入分组字段,但没有实质意义,除非是像“年龄”这样身兼维度和度量两个类型的度量。
(2)维度也可以加入右侧的“聚合字段”区域,因为分类字段是可以被聚合的(计数、最大最小值),比如计算每个月有多少订单、每个月有多少客户。
(3)聚合还可以间接起到移除字段的作用,相当于SQL查询,既减少了查询量,又实现了查询过程中的聚合。熟悉SQL的读者,可以参考SQL语言中的group by语法。
(4)很多专业数据库的数据仓库,其实就是把频繁的聚合查询,以定期运行的方式提取到本地存储起来,有时候称之为“物化视图”,指实际存在的数据表,而非虚拟的查询过程。借助于Prep Builder的流程创建和Prep Conductor的流程自动化功能,Tableau可以实现数据仓库的相关功能,还可以在实时查询和数据提取间随时切换,从而兼顾数据的实时性和读取效率。因此,笔者倾向于把Tableau Prep称之为“流程化的数据仓库”,它具有“数据仓库”欠缺的敏捷性,又具有面向业务分析的友好特征。