• day 11 拉链


    --加载算法--

    --全量覆盖
    hive的写法是
    insert overnrite table 表名

    --sql 的写法是
    select
    字段名称 as 字段名称新
    from 表名

    增量追加
    先删除p层里面的数据
    delete from 表名 where 条件
    inse into 表明
    select * from 表名2 s层的表


    拉链是记录记录某个数据在某一时间段的状态

    例如:
    id money date
    mo 1000w 20180604
    mo 500w 20180605

    id money start_date end_date
    mo 1000w 20180601 30000102 一开始的状态


    mo 1000w 20180601 20180605 进入银行记录状态,不知道这个钱的来历
    mo 500w 20180601 20180610 6月5号消费花掉500w还剩500w记录在银行的状态
    mo 0 20180610 30000102 6月10号又花掉了500w,所以上面的end_date日期记录为最新消费的日期



    数据三种状态
    p层里面没有 s层里面是新增的
    p层里面有 s层里面也有 数据发生变化了这叫更新
    p层里面有 s层里面也有 数据是原有的且没有变化
    drop table sdata.dbo.mo_money
    create table sdata.dbo.mo_money
    (
    name varchar(255)
    ,money float
    ,date_stamp date
    )


    拉链表
    drop table pdata.dbo.mo_money_history
    create table pdata.dbo.mo_money_history
    (
    name varchar(255)
    ,money float
    , start_date date
    ,end_date date
    )


    往s层插入一条数据

    insert into sdata.dbo.mo_money
    values('mo','1000','2018-06-01')
    insert into sdata.dbo.mo_money
    values('jerry','11000','2018-05-01')
    select * from sdata.dbo.mo_money

    将数据分为三种状态 一定要去重sdata.dbo.mo_money里面的数据是一条但是
    pdata.dbo.mo_money_history里面mo 的数据是两条造1对2 的情况
    drop table sdata.dbo.mo_money_falg
    select
    distinct
    a.*
    ,case when b.name is null then 1 --新增--
    when b.name IS not null and a.money <> b.money then 2 --更新--
    when b.name IS not null and a.money = b.money then 3 --不变--
    end flag
    into sdata.dbo.mo_money_falg
    from sdata.dbo.mo_money a
    left join pdata.dbo.mo_money_history b
    on a.name = b.name
    select * from sdata.dbo.mo_money_falg

    将新增数据插入到p层
    insert into pdata.dbo.mo_money_history
    select
    a.name
    ,a.money
    ,a.date_stamp
    ,'3000-01-01' --结束时间
    from
    sdata.dbo.mo_money a
    inner join
    sdata.dbo.mo_money_falg b
    on a.name = b.name
    where b.flag = 1
    select* from pdata.dbo.mo_money_history


    新增数据形成闭连
    往在s层插入一条数据
    delete from sdata.dbo.mo_money 删除这个表里面的数据
    insert into sdata.dbo.mo_money
    values('mo','0','2018-06-08')
    insert into sdata.dbo.mo_money
    values('jerry','5','2018-05-20')
    select * from sdata.dbo.mo_money

    将数据分为三种状态
    drop table sdata.dbo.mo_money_falg
    select a.*
    ,case when b.name is null then 1
    when b.name IS not null and a.money <> b.money then 2
    when b.name IS not null and a.money = b.money then 3
    end flag
    into sdata.dbo.mo_money_falg
    from sdata.dbo.mo_money a
    left join pdata.dbo.mo_money_history b --p层的数据--
    on a.name = b.name
    select * from sdata.dbo.mo_money_falg


    将新增数据插入到p层 进行闭连update
    update pdata.dbo.mo_money_history
    set end_date=b.date_stamp
    from pdata.dbo.mo_money_history
    inner join
    sdata.dbo.mo_money_falg b
    on pdata.dbo.mo_money_history.name = b.name
    where b.flag = 2 and pdata.dbo.mo_money_history.end_date='3000-01-01'
    select* from pdata.dbo.mo_money_history

    插入数据
    insert into pdata.dbo.mo_money_history
    select
    name
    ,money
    ,b.date_stamp
    ,'3000-01-01'
    from sdata.dbo.mo_money_falg b
    where b.flag = 2

    select * from pdata.dbo.mo_money_history

  • 相关阅读:
    Python文件File方法
    python的slice notation的特殊用法
    函数
    字典
    python 笔记7
    列表解析与生成器
    [CenOS7][Mac] MAC环境中dubbo连接zookeeper超时
    [JAVA][Thread] 实现Runnable接口和继承Thread类创建线程哪种方式更好?
    [Java] String字符常量类型作为参数传递的一些问题
    [JAVA]hashCode()和identityHashCode()的区别
  • 原文地址:https://www.cnblogs.com/simly/p/9498356.html
Copyright © 2020-2023  润新知