インクリメンタルテーブルとジッパーテーブル、分かりますか?

データの準備

9月10日のデータの初日

1,待支付,2020-09-10 12:20:11,2020-09-10 12:20:11
2,待支付,2020-09-10 14:20:11,2020-09-10 14:20:11
3,待支付,2020-09-10 16:20:11,2020-09-10 16:20:11

9月11日のデータの初日

1,待支付,2020-09-10 12:20:11,2020-09-10 12:20:11
2,已支付,2020-09-10 14:20:11,2020-09-11 14:21:11
3,已支付,2020-09-10 16:20:11,2020-09-11 16:21:11
4,待支付,2020-09-11 12:20:11,2020-09-11 12:20:11
5,待支付,2020-09-11 14:20:11,2020-09-11 14:20:11

mysqlの1日目と2日目のデータを比較すると、2日目に注文ID 4と5の2つの新しいデータが追加され、注文ID2と3のステータスが更新されて支払われることがわかります。

全量表

毎日のすべての最新のステータスデータ。

1.変更がある場合は、フルスケールで報告する必要があります

2.毎回報告されるデータはすべてのデータです(変更+変更なし)

9月10日のodsレイヤーへのフルドロー

create table wedw_ods.order_info_20200910(
 order_id     string    COMMENT '订单id'
,order_status string    COMMENT '订单状态'
,create_time  timestamp COMMENT '创建时间'
,update_time  timestamp COMMENT '更新时间'
) COMMENT '订单表'
row format delimited fields terminated by ','
;

ここに写真の説明を挿入

create table wedw_dwd.order_info_df(
 order_id     string    COMMENT '订单id'
,order_status string    COMMENT '订单状态'
,create_time  timestamp COMMENT '创建时间'
,update_time  timestamp COMMENT '更新时间'
) COMMENT '订单表'
partitioned by (date_id string)
row format delimited fields terminated by ','
;

# 把wedw_ods.order_info_20200910数据全量插到dwd层2020-09-10分区
insert overwrite table wedw_dwd.order_info_df
 partition(date_id = '2020-09-10')
select
order_id
,order_status
,create_time
,update_time
from wedw_ods.order_info_20200910
;

ここに写真の説明を挿入
9月11日に、全額がodsレイヤーに描画されます


create table wedw_ods.order_info_20200911(
 order_id     string    COMMENT '订单id'
,order_status string    COMMENT '订单状态'
,create_time  timestamp COMMENT '创建时间'
,update_time  timestamp COMMENT '更新时间'
) COMMENT '订单表'
row format delimited fields terminated by ','
;

ここに写真の説明を挿入


# 把wedw_ods.order_info_20200911数据全量插到dwd层2020-09-11分区
insert overwrite table wedw_dwd.order_info_df 
partition(date_id = '2020-09-11')
select
order_id
,order_status
,create_time
,update_time
from wedw_ods.order_info_20200911
;

ここに写真の説明を挿入
完全に抽出すると、各パーティションは完全な履歴スナップショットを保持します。

インクリメントテーブル

インクリメンタルテーブル:新しいデータインクリメンタルデータは、最後のエクスポート後の新しいデータです。

1.合計金額ではなく、各増加の金額を記録します。

2.インクリメントテーブル、変更量のみが報告され、変更は不要です

3.ビジネスデータベーステーブルには、プライマリキー、作成時間、および変更時間が必要です。

9月10日にodsレイヤーに完全に抽出されました(完全な初期化)
ここに写真の説明を挿入


# 把wedw_ods.order_info_20200910数据全量插到dwd层2020-09-10分区
insert overwrite table wedw_dwd.order_info_di
 partition(date_id = '2020-09-10')
select
order_id
,order_status
,create_time
,update_time
from wedw_ods.order_info_20200910
;

ここに写真の説明を挿入
9月11日に抽出された更新データと同日に新しく追加されたデータ、つまり注文ID
ここに写真の説明を挿入
が2、3、4、5のデータ、9月10日のwedw_dwd.order_info_diテーブルのパーティションデータ、およびwedw_ods.order_info_20200911から増分抽出されたデータがマージされます。 2つのオプションがあります

a。2つのテーブルはプライマリキーによって関連付けられており、dwdテーブルは存在し、odsテーブルはデータが存在しません。

union all wedw_ods.order_info_20200911テーブルのすべてのデータをクリックします。つまり、dwdテーブルの9月11日にパーティションに全量のデータを挿入します。

insert overwrite table wedw_dwd.order_info_di 
partition(date_id = '2020-09-11')
select
 t1.order_id
,t1.order_status
,t1.create_time
,t1.update_time
from
wedw_dwd.order_info_di t1
left join
wedw_ods.order_info_20200911 t2
on t1.order_id = t2.order_id
where t1.date_id = '2020-09-10'
and t2.order_id is  null
union all
select 
 order_id
,order_status
,create_time
,update_time
from 
wedw_ods.order_info_20200911
;

ここに写真の説明を挿入
b。2つのテーブルデータをすべて結合し、order_idに従って重複排除します(順序に従ってグループ化し、降順で時間を更新し、最初のデータを取得します)


insert overwrite table wedw_dwd.order_info_di partition(date_id = '2020-09-11')
select
 t2.order_id
,t2.order_status
,t2.create_time
,t2.update_time 
from
(
    select
     t1.order_id
    ,t1.order_status
    ,t1.create_time
    ,t1.update_time
    ,row_number() over(partition by order_id order by update_time desc) as rn
    from
    (
        select
         order_id
        ,order_status
        ,create_time
        ,update_time
        from
        wedw_dwd.order_info_di 
        where date_id = '2020-09-10'
 
        union all
 
        select 
         order_id
        ,order_status
        ,create_time
        ,update_time
        from 
        wedw_ods.order_info_20200911
    ) t1
) t2
where t2.rn = 1
;

ここに写真の説明を挿入
特別なインクリメンタルテーブル:daテーブル、日次パーティションはその日のデータであり、そのデータ特性は、ログテーブルなどのデータが生成された後も変更されないことです。

ジッパーテーブル

履歴ステータスと最新のステータスデータを維持する

適用状況:

1.データ量が比較的多い

2.テーブルの一部のフィールドが更新されます

3.特定の時点または期間の履歴スナップショット情報を表示する必要があります。履歴の特定の時点

の特定の注文のステータスを表示します。過去の特定の期間に特定のユーザーが行った注文の数

4.更新の割合と頻度はそれほど大きくありません

表の情報があまり変わらず、毎日全額が保管されていると、変更されていない情報が全額保存されるため、ストレージの無駄になります。

利点

1.反応データの履歴状態を満たします

2.ストレージを最大限に節約する

9月10日のodsレイヤーへのフルドロー

create table wedw_ods.order_info_20200910(
 order_id     string    COMMENT '订单id'
,order_status string    COMMENT '订单状态'
,create_time  timestamp COMMENT '创建时间'
,update_time  timestamp COMMENT '更新时间'
) COMMENT '订单表'
row format delimited fields terminated by ','
;

ここに写真の説明を挿入
dwdレイヤージッパーテーブルの作成次の
2つのフィールドを追加します
。start_dt(レコードのライフサイクルの開始時刻-サイクルスナップショット時の状態を
表すend_dt(レコードのライフサイクルの終了時刻)

end_dt = '9999-12-31'は、レコードが現在有効な状態にあることを意味します

create table wedw_dwd.order_info_dz(
 order_id     string    COMMENT '订单id'
,order_status string    COMMENT '订单状态'
,create_time  timestamp COMMENT '创建时间'
,update_time  timestamp COMMENT '更新时间'
,start_dt     date      COMMENT '开始生效日期'
,end_dt       date      COMMENT '结束生效日期'
) COMMENT '订单表'
partitioned by (date_id string)
row format delimited fields terminated by ','
;

注:初めて処理するときは、すべてのデータを初期化する必要があります。start_timeはデータ日付2020-09-10に設定され、end_timeは9999-12-31に設定されます。


insert overwrite table wedw_dwd.order_info_dz
 partition(date_id = '2020-09-10')
select
 order_id    
,order_status
,create_time 
,update_time 
,to_date(update_time) as start_dt   
,'9999-12-31' as end_dt  
from
wedw_ods.order_info_20200910
;

ここに写真の説明を挿入
9月11日に、更新されたデータとその日に新しく追加されたデータをodsレイヤーに抽出します。つまり、注文IDが2、3、4、5のデータです。
ここに写真の説明を挿入

insert overwrite table wedw_dwd.order_info_dz
 partition(date_id = '2020-09-11')
select
 t1.order_id    
,t1.order_status
,t1.create_time 
,t1.update_time
,t1.start_dt
,case when t1.end_dt = '9999-12-31' 
and t2.order_id is not null 
then t1.date_id 
else t1.end_dt end as end_dt
from
wedw_dwd.order_info_dz t1
left join wedw_ods.order_info_20200911 t2
on t1.order_id = t2.order_id
where t1.date_id = '2020-09-10'
union all
SELECT
 t1.order_id    
,t1.order_status
,t1.create_time 
,t1.update_time
,to_date(update_time) as start_dt
,'9999-12-31' as end_dt
FROM wedw_ods.order_info_20200911 t1
;

ここに写真の説明を挿入
現在有効なすべてのレコードを照会します。

select 
* 
from 
wedw_dwd.order_info_dz 
where 
date_id = '2020-09-11'
and end_dt ='9999-12-31'
;

ここに写真の説明を挿入
9月10日の履歴スナップショットをクエリします。


select 
* 
from 
wedw_dwd.order_info_dz 
where 
date_id = '2020-09-10' 
and start_dt <= '2020-09-10' 
and end_dt >='2020-09-10'
;

ここに写真の説明を挿入
9月11日の履歴スナップショットをクエリします。


select 
* 
from 
wedw_dwd.order_info_dz 
where 
date_id = '2020-09-11' 
and start_dt <= '2020-09-11' 
and end_dt >='2020-09-11'
;

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42706464/article/details/108942442