这篇文章我们主要讲解下以下几个点
- 什么是拉链表,用于什么样的场景
- 拉链表的示例
- 如何获取某一天的历史状态
- 如何在使用维度拉链表并使用代理键的前提下,构建含维度代理键的事实表
1.什么是拉链表,用于什么样的场景
当维度数据发生变化时,将旧数据置为失效,将更改后的数据当作新的记录插入到维度表中,并开始生效,这样能够记录数据在某种粒度上的变化历史。
2.拉链表的示例
结合之前所讲的代理键 ,Uid_org 为原始的业务主键,Uid_agency 为代理键
Uid_agency | Uid_org | name | dept | Start_date | End_date |
1 | 1 | jiangtai | Dep1 | 20180501 | 20180509 |
2 | 1 | jiangtai | Dep2 | 20180510 | 20991231 |
如何生成代理键,请参看我的另一篇文章
https://blog.csdn.net/u010003835/article/details/104420508
3. 如何获取某一天的历史状态
SELECT *
FROM lalian_table
WHERE start_date <= ‘${bizdate}’ AND end_date >= ‘${bizdate}’
4. 如何在使用维度拉链表并使用代理键的前提下,构建含维度代理键的事实表
对应实际需求:统计部门的销售额,用户A 某日从部门dep1 转到到 dep2 , 年底统计各个部门的销售额
最终的目标表 :fact_order
Oid | Uid | Tm_id | … |
(Order 表主键) | (User 表代理键) | 其他维度 | … |
|
|
|
|
User 维度表 :dim_user
Uid | id | name | dept | Start_date | End_date | … |
User表代理键 | User表业务键 | 用户姓名 | 用户部门 | 开始时间 | 结束时间 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Order 表(原始表)
Oid | Id | Created_time | Updated_time | … |
Order表主键 | User表业务键 | 创建时间 | 修改时间 |
|
|
|
|
|
|
|
|
|
|
|
从order 表抽取增量的数据
SELECT * FROM WHERE created_time > '2019-06-01' -> 生成快照表 order_inc
(注意: 这里我们要对增量数据生成代理键)
非 Hive 的写法 :
SELECT ta.* , tb.uid
FROM order_inc AS ta
JOIN dim_user AS tb
ON ta.id = tb.id
AND tb.start_date <= ta.created_time
AND tb.end_date >= ta.created_time
// 这里注意2点 :
1.这里 created_time 相当于固定值,因为created_time 其实是固定的,及某一天
2.Hive 中是不支持 JOIN 中用不等连接的,这点要注意 !!!
Hive 写法
SELECT *
FROM
(
SELECT ta.*, tb.uid
FROM order_inc AS ta
JOIN dim_user AS tb
ON ta.id = tb.id
) AS tmp
WHERE tmp.start_date <= tmp.created_time
AND tmp.end_date >= tmp.created_time