这篇文章我们主要讲解下以下几个点
- 什么是拉链表,用于什么样的场景
- 拉链表的示例
- 如何获取某一天的历史状态
- 如何在使用维度拉链表并使用代理键的前提下,构建含维度代理键的事实表
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