用ETL制作数据快照
需求背景
数据集里某些字段不定期可能会发生变化,例如商品单价、会员等级、事件进展,如果源数据库里没有存储所有历史信息,或者展现在仪表板上的数据是基于当前时间的汇总数据时,怎么查询过去的数据状态或者记录下所有的数据变化呢?
这时候就需要用到数据快照。快照关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始时间点)的映像,快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。其实就像照相机一样,相机快门一闪,记录下那一时刻。不一样的就是快照可以恢复到那一时刻,但是我们却永远也会不到我们照片中的曾经时刻。
适用场景
数据量不大或者仅需要记录有变化数据的情况下,建议使用观远BI自带的ETL来制作数据快照;数据量巨大的情况下建议制作拉链表来存储历史数据(此时需要使用UDF时序函数或者视图数据集,本文暂不涉及)。
实现方法
在ETL里按需对原始数据进行处理和聚合(建议使用分组聚合),缩小数据量,然后新建计算字段「storage date」给数据打时间戳,按日做快照可以使用 current_date()。
设置输出数据集名字和保存路径,然后运行ETL。
回到ETL编辑页面,暂时断开ETL里输出数据集和前一步的关联(仅删除关联线,不要删除输出数据集)。
添加一个新的“输入数据集”,选择上一步ETL运行得到的输出数据集;为了防止ETL一天内多次运行造成数据多次拼接从而产生冗余数据,添加计算列「今天」(函数current_date()),然后筛选 「storage date」小于今天,把今天生成的数据先清理掉,相当于前置清理,得到历史数据。
使用“行拼接”节点,把两个分支得到的当天最新数据和历史数据拼接起来,然后关联原来的输出数据集并保存,同时设置每天定时更新,一般建议一天更新一次即可。
案例分享
已经按照上述方法得到了一张task排期快照表,现在需要筛选出每天task排期发生变化的记录,并生成快照,最终实现在仪表板上可以查看任意时间范围内的排期变化,以及某一个排期周期内所有变动过的tasks。
实现步骤
新建ETL,选择输入数据集,添加计算列来判断今天和昨天。
加两个“筛选数据行”节点,分别筛选“今天“和“昨天”,然后以“今天”为基础表左关联“昨天”。关联时仅选择需要的字段,按需进行重命名。
新建字段来对比昨天和今天的数据,判断排期是否变化,再过滤掉排期无变化的数据,设置好输出数据集,保存并运行。
重新引用上一步生成的输出数据集作为输入数据集,和原来的数据表进行行拼接,重新保存并运行ETL,设置每天定时更新。第一次运行后只有运行当天的数据,随着之后每天运行,每天发生的排期变化会被记录并保存下来,快照表完成。
制作页面卡片,日期筛选联动ETL里新建的日期戳字段(storage date),排期信息需要跨多字段搜索,需要新建字段引用全局参数来实现。
最终页面展示效果如下:
快照表维护
尽量在ETL制作初期,第一次运行ETL后,添加行拼接前,检查数据质量并确定好最终保留字段。运行一段时候后再修改逻辑、增删字段的话,需要在ETL里,对「行拼接」前面的两个分支都进行修改。