数据服务:离线,实时数据服务

数据仓库

业务系统和数仓的区别

拉链表

概念

数据仓库保留了大量的历史数据,对时间维度上的数据分析工作提供了重要的手段。而保留历史数据的最常见的方法就是使用历史拉链表,历史拉链表仅当数据发送变更时,才相应的发生变更,这样就能有效保留历史数据的变动信息,又不会浪费存储空间。

适用于以下场景:

数据量有点大,表中某些字段有变化,但是变化的频率也不是很高,业务需求又需要统计这种变化状态,每天全量一份呢,有点不太现实,不仅浪费了存储空间,有时可能业务统计也有点麻烦,这时,拉链表的作用就体现出来了,既节省空间,又满足了需求。

一般通过在数仓中增加start_date和end_date字段来实现,其中start_date表示该条记录的生命周期开始时间,end_date表示该条记录的结束生命周期(不包括该日期)。

1   支付 2016-08-21  2016-08-21
1   完成 2016-08-22  9999-12-31
2   创建 2016-08-20  2016-08-20
2   完成 2016-08-21  9999-12-31
3   创建 2016-08-20  2016-08-21
3   支付 2016-08-22  9999-12-31
4   创建 2016-08-21  2016-08-21
4   支付 2016-08-22  9999-12-31
5   创建 2016-08-22  9999-12-31

比如上面就是一个数仓中订单表中(order_his)的数据,其中最后两列是start_date和end_date字段,

end_date=‘ 9999-12-31’表示该条记录目前处于有效状态,而其他则表示是一段历史.

--如果查询当前所有有效的记录
select * from order_his where dw_end_date = ‘9999-12-31′
--如果查询2016-08-21的历史快照
select * from order_his where begin_date <= ‘2016-08-21′ and end_date >= ‘2016-08-21’

拉链算法

  1. 采集当日全量数据到ND(NewDay)表;
  2. 可从历史表中取出昨日全量数据存储到OD(OldDay)表;
  3. (ND-OD)就是当日新增和变化的数据,也就是当天的增量,用W_I表示;
  4. (OD-ND)为状态到此结束需要封链的数据,用W_U表示;
  5. 将W_I表的内容全部插入到历史表中,这些是新增记录,start_date为当天,而end_date为max值;
  6. 对历史表进行W_U部份的更新操作,start_date保持不变,而end_date改为当天,也就是关链操作;

更新操作

这里举个栗子说明,并且以天为维度做拉链.

首先我们创建表结构:

--订单流水表
CREATE TABLE orders (
orderid INT,
createtime STRING,
modifiedtime STRING,
status STRING
) row format delimited fields terminated by '\t'
 
--订单增量表
CREATE TABLE ods_orders_inc (
orderid INT,
createtime STRING,
modifiedtime STRING,
status STRING
) PARTITIONED BY (day STRING)
row format delimited fields terminated by '\t'
 
--订单数仓历史表 
CREATE TABLE dw_orders_his (
orderid INT,
createtime STRING,
modifiedtime STRING,
status STRING,
dw_start_date STRING,
dw_end_date STRING
) row format delimited fields terminated by '\t' ;

第一次历史表中没有数据,需要全量更新(这里假设订单流水表中已经有数据了),

全量更新数据,我们先到2016-08-20为止的数据(假设第一天数据变化日期是2016-08-20):

--初始化,先把2016-08-20的数据初始化到增量表
INSERT overwrite TABLE ods_orders_inc PARTITION (day = '2016-08-20')
SELECT orderid,createtime,modifiedtime,status
FROM orders
WHERE createtime < '2016-08-21' and modifiedtime <'2016-08-21';

--再初始化到历史表
INSERT overwrite TABLE dw_orders_his
SELECT orderid,createtime,modifiedtime,status,
createtime AS dw_start_date,
'9999-12-31' AS dw_end_date
FROM ods_orders_inc
WHERE day = '2016-08-20';

通过上面可以知道:

  1. 增量表里存了一份全量数据
  2. 历史表中也存了一份全量数据,并且表示为当前有效

然后我们再接着更新2016-08-21的数据:

--1.保存一份2016-08-21的增量数据到增量表中
INSERT overwrite TABLE ods_orders_inc PARTITION (day = '2016-08-21')
SELECT orderid,createtime,modifiedtime,status
FROM orders
WHERE (createtime = '2016-08-21'  and modifiedtime = '2016-08-21') OR modifiedtime = '2016-08-21';

--2.然后增量表关联到一张临时表中,再插入到新表中
--临时表
DROP TABLE IF EXISTS dw_orders_his_tmp;
CREATE TABLE dw_orders_his_tmp AS
SELECT orderid,
createtime,
modifiedtime,
status,
dw_start_date,
dw_end_date
FROM (
    SELECT a.orderid,
    a.createtime,
    a.modifiedtime,
    a.status,
    a.dw_start_date,
    CASE WHEN b.orderid IS NOT NULL AND a.dw_end_date > '2016-08-21' THEN '2016-08-21' ELSE a.dw_end_date END AS dw_end_date
    FROM dw_orders_his a
    left outer join (SELECT * FROM ods_orders_inc WHERE day = '2016-08-21') b
    ON (a.orderid = b.orderid)
    UNION ALL
    SELECT orderid,
    createtime,
    modifiedtime,
    status,
    modifiedtime AS dw_start_date,
    '9999-12-31' AS dw_end_date
    FROM ods_orders_inc
    WHERE day = '2016-08-21'
) x
ORDER BY orderid,dw_start_date;
--插入到历史表
INSERT overwrite TABLE dw_orders_his;

更新2016-08-22的数据和上面的步骤2类似.

通过上面可知,每天历史表拉链数据变更包括两部分(以2016-08-21举例):

  1. 2016-08-21当天的全部增量数据,其所有记录是有效的
  2. 已经存到历史表中的数据,如果2016-08-21当天有增量更新,则该条记录生命周期结束时间记录为2016-08-21这天

当然除了上面的,在库里存着的这次没有变更的原样保存,不做更改。

结论

  1. 拉链表中存的是一段时间的快照
  2. 这样减少了数据的冗余
  3. 如果start_date和end_date有索引的话,查询性能会大大提高

模型

3NF

主要目的是消除冗余。

E-R图.

维度建模

为什么说维度建模是展现分析数据的首选技术?

  • 以商业用户可理解的方式发布数据
  • 提供高效的查询性能

事实表和维度表

事实表

维度模型中的事实表存储组织机构业务过程事件的性能度量结果.

“事实”这一术语表示某个业务度量.

事实表中的每行对应一个度量事件.每行中的数据是一个特定级别的细节数据,称为粒度。例如,销售事务中用一行来表示每个卖出去的产品。维度建模的核心原则之一是同一事实表中的所有度量行必须具有相同的粒度。

一般事实表具有两个或者更多个外键与维度表的主键关联。

事实表通常有包含外键集合的主键。事实表的主键常称为组合键,具有组合键的表称为事实表。事实表表示多对多关系。其他表称为维度表。

通常几个维度一起唯一标识某个事实表行。当确定了所有维度中唯一标识事实表行的子集后,其他维度使用事实表行的主键的单一值。换句话说,其他维度只是参与其中。

维度表

每个维度表有单一的主键定义,用于在与事实表连接操作时实现参照完整性的基础。

维度属性可作为查询约束、分组、报表标识的主要来源。对查询或报表请求来说,属性以词或词组加以区分。

维度提供数据的入口点,提供所有DW/BI分析的最终标识和分组。

概述

维度模型表示每个业务过程包含事实表,事实表存储事件的数值化度量,围绕事实表的是多个维度表,维度表包含事件发生时实际存在的文本环境。这种类似星状的结构通常称为星型连接。

Data Vault

基于大数据的数仓分层

基于大数据的数据服务管理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容