淘先锋技术网

首页 1 2 3 4 5 6 7

这篇文章我们主要讲解下以下几个点

 

  1. 什么是拉链表,用于什么样的场景
  2. 拉链表的示例
  3. 如何获取某一天的历史状态
  4. 如何在使用维度拉链表并使用代理键的前提下,构建含维度代理键的事实表

 

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