1 基于Hudi表实现拉链表的方案
由于Hudi表存储为了保证数据唯一性要求有主键,拉链表会对某一个对象的历史状态都存储所以主键设计为联合主键,将对象ID和生效时间作为联合主键。
Hudi新增了数据的更新能力,因此相对于传统的大数据平台,可以基于update的能力优化传统hive的拉链表的实现方案。
增量数据一般不携带历史数据的生效时间
2 拉链表实现算法
当前最新的拉链表为Now_table(UserID:用户ID,BundleID为套餐ID;Start_date为生效时间;End_date为失效效时间)
新增数据Tmp_table,(由于大数据平台的数据基于上游采集而来,基于时间戳的增量数据相对容易获取到)
新增数据Tmp_table与Now_table关联,将以存在数据更新写入Now_table,end_date为当前时间
将新增数据全部写入Now_table,end_date为'9999-12-31'
3 实现举例
创建Now_table,并初始化数据
新增数据临时表Tmp_table,新增数据到Tmp_table
Tmp_table数据内容如下:
将Now_table数据闭链
Now_table数据变更如下:
将增量数据开链写入Now_table
Now_table数据更新如下:
通过userid可以查询到历史的状态变化。
4 算法总结
Hudi表具有数据更新能力,不需要对全表数据进行insert overwrite操作,算法更简单
Hudi表提供Upsert的能力,当相同主键的数据存在,新数据会自动更新老数据,因此不用对老数据进行update操作,直接Insert即可(Sparksql的Insert操作默认为upsert操作。)
对于缓慢变化维的操作会更加简化,设置合理的主键,基于Merge语法直接操作,会更加简单。
领取专属 10元无门槛券
私享最新 技术干货