让决策更智能
新一代智能数据分析平台

用ETL制作数据快照的方法

观小远发表于:2021年06月01日 17:11:14更新于:2021年06月02日 14:25:00

需求背景:

       数据集里某些字段不定期可能会发生变化,例如商品单价、会员等级、事件进展,如果源数据库里没有存储所有历史信息,或者展现在仪表板上的数据是基于当前时间的汇总数据时,怎么查询过去的数据状态或者记录下所有的数据变化呢?

       这时候就需要用到数据快照。快照关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始时间点)的映像,快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。其实就像照相机一样,相机快门一闪,记录下那一时刻。不一样的就是快照可以恢复到那一时刻,但是我们却永远也会不到我们照片中的曾经时刻。

适用场景:

       数据量不大或者仅需要记录有变化数据的情况下,建议使用观远BI自带的ETL来制作数据快照;数据量巨大的情况下建议制作拉链表来存储历史数据(此时需要使用UDF时序函数或者视图数据集,本文暂不涉及)。

实现方法:

1. 在ETL里按需对原始数据进行处理和聚合(建议使用分组聚合),缩小数据量,然后新建计算字段给数据打时间戳,按日做快照可以使用 current_date(),一天需要多次快照的情况可以用now()。


00160b5f7e0685b7f749fc96630f98c 2. 设置输出数据集名字和保存路径,然后运行ETL。

 00160b5f7e07909a23082ff6219fb93

3. 回到ETL编辑页面,暂时断开ETL里输出数据集和前一步的关联(仅删除关联线,不要删除输出数据集)。

00160b5f7e0a2874bf0c505862625c9

4. 添加一个新的“输入数据集”,使用上一步ETL运行得到的输出数据集;添加“行拼接”节点,把两张表拼接起来。

00160b5f7e0ab8e8a310894cfdf4b08

5. 为了防止ETL一天内多次运行造成数据多次拼接从而产生冗余数据,添加“去重”节点,设置去重主键,然后关联好输出数据集并保存,同时设置每天定时更新,建议一天更新一次即可。

00160b5f7e0b569b1c9d05f85553dd8

案例分享:

       已经按照上述方法得到了一张task排期快照表,现在需要筛选出每天task排期发生变化的记录,并生成快照,最终实现在仪表板上可以查看任意时间范围内的排期变化,以及某一个排期周期内所有变动过的tasks。

步骤:

1. 新建ETL,选择输入数据集,添加计算列来判断今天和昨天。

00160b5f7e0a221206ed9373566e753

2. 加两个“筛选数据行”节点,分别筛选“今天“和“昨天”,然后以“今天”为基础表左关联“昨天”。关联时仅选择需要的字段,按需进行重命名。

00160b5f7e0b1ecd58930bf0ffca2d5

3. 新建字段来对比昨天和今天的数据,判断排期是否变化,再过滤掉排期无变化的数据,设置好输出数据集,保存并运行。

00160b5f7e09d056e117b965e72bfe6

4. 重新引用上一步生成的输出数据集作为输入数据集,和原来的数据表进行行拼接、去重,重新保存并运行ETL,设置每天定时更新。第一次运行后只有运行当天的数据,随着之后每天运行,每天发生的排期变化会被记录并保存下来,快照表完成。

00160b5f7e0c79f2e51bbc6151b3e52

5. 制作页面卡片,日期筛选联动ETL里新建的日期戳字段(storage date),排期信息需要跨多字段搜索,需要新建字段引用全局参数来实现。

00160b5f7e0e0f738569a61dd14d182

最终页面展示效果如下。

00160b5f7e1080869508990bf951c5c


快照表维护:

       尽量在ETL制作初期,第一次运行ETL后,添加行拼接前,检查数据质量并确定好最终保留字段。运行一段时候后再修改逻辑、增删字段会稍微复杂些。

       例如以上案例,由于同一个Task ID关联了多个客户,这个Task ID在同一天会存在多行数据,除了客户名称不同,其他数据完全一样,那完全可以考虑对多行数据合并成一行。此时需要对参与“行拼接”的两张表都进行修改。

00160b5f7e10ddcf96ab56873f3d702


    您需要登录后才可以回复