RICH-ATONE

HIVE拉链表示例

极限存储:

一般采用拉链表。

拉链表针对一个变化字段进行操作一个变化字段进行设计开始和结束时间。如果有多个字段进行更新变化,则需要设计多个开始和结束时间,复杂度比较高,或者进行拆表进行设计或者选择全量进行存储。

场景:

在数据仓库的数据模型设计过程中,经常会遇到下面这种表的设计:

有一些表的数据量很大,比如一张用户表,大约10亿条记录,50个字段,这种表,即使使用ORC压缩,单张表的存储也会超过100G,在HDFS使用双备份或者三备份的话就更大一些。
表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。
需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态。
表中的记录变化的比例和频率不是很大,比如,总共有10亿的用户,每天新增和发生变化的有200万左右,变化的比例占的很小。

sql示例:

INSERT OVERWRITE TABLE dws.user_his
SELECT * FROM
(
    SELECT A.user_num,
           A.mobile,
           A.reg_date,
           A.t_start_time,
           CASE
                WHEN A.t_end_time = '9999-12-31' AND B.user_num IS NOT NULL THEN 'date_sub('${ds}',1)'
                ELSE A.t_end_time
           END AS t_end_time
    FROM dws.user_his AS A
    LEFT JOIN ods.user_update AS B
    ON A.user_num = B.user_num
UNION
    SELECT C.user_num --用户编号,
           C.mobile --手机号码,
           C.reg_date --注册日期,
           '${ds}' AS t_start_time,
           '9999-12-31' AS t_end_time
    FROM ods.user_update AS C
) AS T

 

参考:

拉链表

posted on 2020-11-18 23:13  RICH-ATONE  阅读(301)  评论(0编辑  收藏  举报

导航