数据仓库中拉链表的实现程序_拉链表中统计90天数据

数据仓库中拉链表的实现程序_拉链表中统计90天数据在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间。拉链表适用于以下几种情况吧数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业务需求呢又需要统计这种变化状态,每天全量一份呢,有点不太现实,不仅浪费了存储空间,有时可能业务统计也有点麻烦,这时,拉链表的作用就提现出来了,既节省空间,又满足了需求。一般在数仓中通过增加begi…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

目录

一、拉链表功能及应用

二、拉链表效果展示

三、拉链表案例操作

1)拉链建表语句

2)第一次全量操作详解

3)以后增量操作详解

4)整体sql详解



一、拉链表功能及应用

在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间。

拉链表适用于以下几种情况吧

数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业务需求呢又需要统计这种变化状态,每天全量一份呢,有点不太现实,

不仅浪费了存储空间,有时可能业务统计也有点麻烦,这时,拉链表的作用就提现出来了,既节省空间,又满足了需求。

一般在数仓中通过增加begin_date,en_date来表示,如下例,后两列是start_date和end_date.

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

begin_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   2016-08-20  2016-08-20  创建
2   2016-08-20  2016-08-20  创建
3   2016-08-20  2016-08-20  创建
1   2016-08-20  2016-08-21  支付
2   2016-08-20  2016-08-21  完成
4   2016-08-21  2016-08-21  创建
1   2016-08-20  2016-08-22  完成
3   2016-08-20  2016-08-22  支付
4   2016-08-21  2016-08-22  支付
5   2016-08-22  2016-08-22  创建

根据拉链表我们希望得到的是

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

可以看出 1,2,3,4每个订单的状态都有,并且也能统计到当前的有效状态。

三、拉链表案例操作

1)拉链建表语句

本例以hive为例,只考虑到实现,与性能无关

首先创建表

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' ;

2)第一次全量操作详解

首先全量更新,我们先到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';

刷到dw中

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';

如下结果

select * from dw_orders_his;
OK
1  2016-08-20  2016-08-20  创建 2016-08-20  9999-12-31
2  2016-08-20  2016-08-20  创建 2016-08-20  9999-12-31
3  2016-08-20  2016-08-20  创建 2016-08-20  9999-12-31

3)以后增量操作详解

剩余需要进行增量更新

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';
 
select * from ods_orders_inc where day='2016-08-21';
OK
1  2016-08-20  2016-08-21  支付 2016-08-21
2  2016-08-20  2016-08-21  完成 2016-08-21
4  2016-08-21  2016-08-21  创建 2016-08-21

4)整体sql详解

先放到增量表中,然后进行关联到一张临时表中,在插入到新表中
1、 判断失效值,
2、 判断有效值,
3、通过UNION ALL进行联合 http://www.w3school.com.cn/sql/sql_union.asp

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
SELECT * FROM dw_orders_his_tmp;

在根据上面步骤把2016-08-22号的数据更新进去,最后结果如下

select * from dw_orders_his;
OK
1  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-20
1  2016-08-20  2016-08-21  支付 2016-08-21  2016-08-21
1  2016-08-20  2016-08-22  完成 2016-08-22  9999-12-31
2  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-20
2  2016-08-20  2016-08-21  完成 2016-08-21  9999-12-31
3  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-21
3  2016-08-20  2016-08-22  支付 2016-08-22  9999-12-31
4  2016-08-21  2016-08-21  创建 2016-08-21  2016-08-21
4  2016-08-21  2016-08-22  支付 2016-08-22  9999-12-31
5  2016-08-22  2016-08-22  创建 2016-08-22  9999-12-31

至此,就得到了我们想要的数据。

四、工作中拉链表实现(可以忽略)

在这里插入图片描述
1、拉链表为数据的最终表,因此只有一张表,且一定要有Join操作。
2、拉链非加密且非解密:
1)stage需要和dwd进行join操作,所以stage和dwd字段名称一致
2)tmp.dwd会将数据通过覆盖加载到dwd中,dwd为最终结果表。
3、拉链加密及解密:
1)stage和Tmp.Result_dwd(Tmp.Result_ewd)进行join连接,然而加密之后字段名称改变(例如sha2,字段变更filed_sha2),所以Tmp.Result_dwd(Tmp.Result_ewd)保留原始字段名称和加密之后字段名称。
2)tmp.dwd和tmp.ewd是stage和Tmp.Result_dwd(Tmp.Result_ewd)和join临时表。
3)Tmp.Result_dwd(Tmp.Result_ewd)会将加密之后的字段以及没加密字段会存储到dwd和ewd中


北京小辉微信公众号

在这里插入图片描述


大数据资料分享请关注

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181205.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android scaleanimation动画,Android 动画之ScaleAnimation应用详解「建议收藏」

    android scaleanimation动画,Android 动画之ScaleAnimation应用详解「建议收藏」android中提供了4中动画:AlphaAnimation透明度动画效果ScaleAnimation缩放动画效果TranslateAnimation位移动画效果RotateAnimation旋转动画效果本节讲解ScaleAnimation动画,ScaleAnimation(floatfromX,floattoX,floatfromY,floattoY,intpivotX…

    2022年10月16日
    1
  • 『Asp.Net 组件』Asp.Net 服务器组件 内嵌CSS:将CSS封装到程序集中[通俗易懂]

    『Asp.Net 组件』Asp.Net 服务器组件 内嵌CSS:将CSS封装到程序集中[通俗易懂]代码:usingSystem;usingSystem.Web;usingSystem.Web.UI;usingSystem.Web.UI.HtmlControls;usingSystem.Web.UI.WebControls;namespaceDemoWebControl{///&lt;summary&gt;///自己的Asp.Net服…

    2022年6月22日
    23
  • String,StringBuffer与StringBuilder的区别

    String,StringBuffer与StringBuilder的区别一、JavaString类——String字符串常量字符串广泛应用 在Java编程中,在Java中字符串属于对象,Java提供了 String类来创建和操作字符串。需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:我们可…

    2022年6月28日
    13
  • 如何利用腾讯云服务器搭建个人网站[通俗易懂]

    如何利用腾讯云服务器搭建个人网站[通俗易懂]你是否想要搭建一个网站,却苦苦找不到方法,你是否看到别人搭建的网站,自己羡慕不已,今天,就教大家来搭建一个简单的个人网站。在这里,我采用的是腾讯云服务器搭建的。首先,需要注册腾讯云账号,登录腾讯云,点击控制台进入控制台后,选择域名注册看到的结果如下图所示:开始注册域名:提交订单后,域名就注册成功了。接下来需要购买云主机(云服务器),流程如下用…

    2022年6月29日
    47
  • 自动化测试平台(四):前端环境搭建

    自动化测试平台(四):前端环境搭建上一章节我们实现了用户模块的增删改查接口,现在有了接口了就需要开始开发前端页面对其进行展示交互了。现在越来越多的前端开发框架和UI组件让我们能够更容易迅速的去开发前端页面,这一章节将通过react(Web开发框架)+antd(UI组件库)+ts(Javascript的超集)的技术栈来搭建我们的前端项目。

    2022年6月16日
    41
  • 极光漏洞,”极光”ie漏洞,微软发布2010年第一个IE 0day漏洞“极光”警告、最新官方补丁和解决办法

    极光漏洞,”极光”ie漏洞,微软发布2010年第一个IE 0day漏洞“极光”警告、最新官方补丁和解决办法微软2010年1月14日晚发布公告称,黑客在最近的针对Google、Adobe以及其他公司的攻击中利用了IE零日漏洞。远程代码执行漏洞影响到各Windows版本上运行的近乎全部的IE版本。关键字:极光

    2022年7月2日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号