update 两个表关联_你真的了解全量表,增量表及拉链表吗?
Mysql數(shù)據(jù)準(zhǔn)備
第一天 9月10號(hào)數(shù)據(jù)
1,待支付,2020-09-10 12:20:11,2020-09-10 12:20:112,待支付,2020-09-10 14:20:11,2020-09-10 14:20:113,待支付,2020-09-10 16:20:11,2020-09-10 16:20:11第二天 9月11號(hào)數(shù)據(jù)
1,待支付,2020-09-10 12:20:11,2020-09-10 12:20:112,已支付,2020-09-10 14:20:11,2020-09-11 14:21:113,已支付,2020-09-10 16:20:11,2020-09-11 16:21:114,待支付,2020-09-11 12:20:11,2020-09-11 12:20:115,待支付,2020-09-11 14:20:11,2020-09-11 14:20:11對(duì)比mysql第一天和第二天的數(shù)據(jù)發(fā)現(xiàn),第二天新增了訂單id為4和5這兩條數(shù)據(jù),并且訂單id為2和3的狀態(tài)更新為了已支付
2全量表
每天的所有的最新狀態(tài)的數(shù)據(jù)。
1、全量表,有無(wú)變化,都要報(bào)
2、每次上報(bào)的數(shù)據(jù)都是所有的數(shù)據(jù)(變化的 + 沒有變化的)
9月10號(hào)全量抽取到ods層
create table wedw_ods.order_info_20200910( order_id ? ? string ? ?COMMENT '訂單id',order_status string ? ?COMMENT '訂單狀態(tài)',create_time ?timestamp COMMENT '創(chuàng)建時(shí)間',update_time ?timestamp COMMENT '更新時(shí)間') COMMENT '訂單表'row format delimited fields terminated by ',';create table wedw_dwd.order_info_df( order_id ? ? string ? ?COMMENT '訂單id',order_status string ? ?COMMENT '訂單狀態(tài)',create_time ?timestamp COMMENT '創(chuàng)建時(shí)間',update_time ?timestamp COMMENT '更新時(shí)間') COMMENT '訂單表'partitioned by (date_id string)row format delimited fields terminated by ',';# 把wedw_ods.order_info_20200910數(shù)據(jù)全量插到dwd層2020-09-10分區(qū)insert overwrite table wedw_dwd.order_info_df partition(date_id = '2020-09-10')selectorder_id,order_status,create_time,update_timefrom wedw_ods.order_info_20200910;9月11號(hào)全量抽取到ods層
create?table?wedw_ods.order_info_20200911( order_id ? ? string ? ?COMMENT '訂單id',order_status string ? ?COMMENT '訂單狀態(tài)',create_time ?timestamp COMMENT '創(chuàng)建時(shí)間',update_time ?timestamp COMMENT '更新時(shí)間') COMMENT '訂單表'row format delimited fields terminated by ',';#?把wedw_ods.order_info_20200911數(shù)據(jù)全量插到dwd層2020-09-11分區(qū)insert?overwrite?table?wedw_dwd.order_info_df?partition(date_id?=?'2020-09-11')selectorder_id,order_status,create_time,update_timefrom?wedw_ods.order_info_20200911;全量抽取,每個(gè)分區(qū)保留歷史全量快照。
3增量表
增量表:新增數(shù)據(jù),增量數(shù)據(jù)是上次導(dǎo)出之后的新數(shù)據(jù)。
1、記錄每次增加的量,而不是總量;
2、增量表,只報(bào)變化量,無(wú)變化不用報(bào)
3、業(yè)務(wù)庫(kù)表中需有主鍵及創(chuàng)建時(shí)間,修改時(shí)間
9月10號(hào)全量抽取到ods層(全量初始化)
# 把wedw_ods.order_info_20200910數(shù)據(jù)全量插到dwd層2020-09-10分區(qū)insert?overwrite?table?wedw_dwd.order_info_di?partition(date_id?=?'2020-09-10')selectorder_id,order_status,create_time,update_timefrom wedw_ods.order_info_20200910;9月11號(hào)抽取更新的數(shù)據(jù)及當(dāng)天新增的數(shù)據(jù),即訂單id為2,3,4,5的數(shù)據(jù)
wedw_dwd.order_info_di表9月10號(hào)的分區(qū)數(shù)據(jù)與wedw_ods.order_info_20200911增量抽取的數(shù)據(jù)合并,有2種方案
a.兩個(gè)表通過主鍵關(guān)聯(lián),dwd表存在并且ods表不存在的數(shù)據(jù)
union all 一下wedw_ods.order_info_20200911表所有的數(shù)據(jù),即全量數(shù)據(jù)插入到dwd表的9月11號(hào)的分區(qū)
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_timefromwedw_dwd.order_info_di t1left joinwedw_ods.order_info_20200911 t2on t1.order_id = t2.order_idwhere t1.date_id = '2020-09-10'and t2.order_id is nullunion allselect order_id,order_status,create_time,update_timefrom wedw_ods.order_info_20200911;b.兩個(gè)表數(shù)據(jù)union all一下,再根據(jù)order_id去重(根據(jù)order分組,更新時(shí)間降序,取第一條)
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) t2where t2.rn = 1;特殊增量表:da表,每天的分區(qū)就是當(dāng)天的數(shù)據(jù),其數(shù)據(jù)特點(diǎn)就是數(shù)據(jù)產(chǎn)生后就不會(huì)發(fā)生變化,如日志表。
4拉鏈表
維護(hù)歷史狀態(tài),以及最新狀態(tài)數(shù)據(jù)
適用情況:
1.數(shù)據(jù)量比較大
2.表中的部分字段會(huì)被更新
3.需要查看某一個(gè)時(shí)間點(diǎn)或者時(shí)間段的歷史快照信息
? ? 查看某一個(gè)訂單在歷史某一個(gè)時(shí)間點(diǎn)的狀態(tài)
? ? 某一個(gè)用戶在過去某一段時(shí)間,下單次數(shù)
4.更新的比例和頻率不是很大
? ? 如果表中信息變化不是很大,每天都保留一份全量,那么每次全量中會(huì)保存很多不變的信息,對(duì)存儲(chǔ)是極大的浪費(fèi)
優(yōu)點(diǎn)
1、滿足反應(yīng)數(shù)據(jù)的歷史狀態(tài)
2、最大程度節(jié)省存儲(chǔ)
9月10號(hào)全量抽取到ods層
create table wedw_ods.order_info_20200910( order_id ? ? string ? ?COMMENT '訂單id',order_status string ? ?COMMENT '訂單狀態(tài)',create_time ?timestamp COMMENT '創(chuàng)建時(shí)間',update_time ?timestamp COMMENT '更新時(shí)間') COMMENT '訂單表'row format delimited fields terminated by ',';建立dwd層拉鏈表
增加兩個(gè)字段:
start_dt(表示該條記錄的生命周期開始時(shí)間——周期快照時(shí)的狀態(tài))
end_dt(該條記錄的生命周期結(jié)束時(shí)間)
end_dt= ‘9999-12-31’ 表示該條記錄目前處于有效狀態(tài)
create table wedw_dwd.order_info_dz( order_id ? ? string ? ?COMMENT '訂單id',order_status string ? ?COMMENT '訂單狀態(tài)',create_time ?timestamp COMMENT '創(chuàng)建時(shí)間',update_time ?timestamp COMMENT '更新時(shí)間',start_dt ? ? date ? ? ?COMMENT '開始生效日期',end_dt ? ? ? date ? ? ?COMMENT '結(jié)束生效日期') COMMENT '訂單表'partitioned by (date_id string)row format delimited fields terminated by ',';注:第一次加工的時(shí)候需要初始化所有數(shù)據(jù),start_time設(shè)置為數(shù)據(jù)日期2020-09-10?,end_time設(shè)置為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 ?fromwedw_ods.order_info_20200910;9月11號(hào)抽取更新的數(shù)據(jù)及當(dāng)天新增的數(shù)據(jù)到ods層,即訂單id為2,3,4,5的數(shù)據(jù)
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_dtfromwedw_dwd.order_info_dz t1left join wedw_ods.order_info_20200911 t2on t1.order_id = t2.order_idwhere t1.date_id = '2020-09-10'union allSELECT t1.order_id ? ?,t1.order_status,t1.create_time ,t1.update_time,to_date(update_time) as start_dt,'9999-12-31' as end_dtFROM wedw_ods.order_info_20200911 t1;查詢當(dāng)前的所有有效記錄:
select * from wedw_dwd.order_info_dz where date_id = '2020-09-11'and?end_dt?='9999-12-31';查詢9月10號(hào)歷史快照:
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號(hào)歷史快照:
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';5總結(jié)
不知道以上的一些例子大家有沒有看明白呢?
在工作中,其實(shí)上述3種表都是很有可能會(huì)用到的,那么我們應(yīng)該怎么選擇呢?
如果數(shù)據(jù)量不是很大(不超過20W)且預(yù)估后續(xù)增長(zhǎng)的非常慢,可以考慮全量表抽取,這是最簡(jiǎn)便的方法
如果數(shù)據(jù)量目前來說不是很大,但是業(yè)務(wù)發(fā)展很快,數(shù)據(jù)量一段時(shí)間后就會(huì)上來,建議增量抽取哦
目前數(shù)據(jù)量本身就非常大,肯定是需要增量抽取的,比如現(xiàn)在有10億數(shù)據(jù),如果你每天全量抽取一遍,相信我,你會(huì)抽哭的
對(duì)于歷史狀態(tài)需要保存的,這個(gè)時(shí)候就需要使用拉鏈表了,實(shí)際工作中,使用拉鏈表的場(chǎng)景并不會(huì)太多,比如訂單表,保存訂單歷史狀態(tài),維表(緩慢變化維的處理)
2020大數(shù)據(jù)面試題真題總結(jié)(附答案)
微信交流群
緩慢變化維(SCD)常見解決方案
全方位解讀星型模型,雪花模型及星座模型
Sqoop or Datax
left join(on&where)
ID-Mapping
你們公司還在用SparkOnYan嗎?
大廠高頻面試題-連續(xù)登錄問題
朋友面試數(shù)據(jù)研發(fā)崗遇到的面試題
數(shù)據(jù)倉(cāng)庫(kù)分層架構(gòu)
clickhouse實(shí)踐篇-SQL語(yǔ)法
clickhouse實(shí)踐篇-表引擎
簡(jiǎn)單聊一聊大數(shù)據(jù)學(xué)習(xí)之路
朋友面試數(shù)據(jù)專家崗遇到的面試題
HADOOP快速入門
數(shù)倉(cāng)工程師的利器-HIVE詳解
Hive調(diào)優(yōu),每一個(gè)數(shù)據(jù)工程師必備技能
OLAP引擎—Kylin介紹
Hbase從入門到入坑
Kafka
Datax-數(shù)據(jù)抽取同步利器
Spark數(shù)據(jù)傾斜解決方案
Spark統(tǒng)一內(nèi)存管理機(jī)制
數(shù)據(jù)治理之?dāng)?shù)據(jù)質(zhì)量管理
數(shù)據(jù)治理之元數(shù)據(jù)管理
數(shù)據(jù)倉(cāng)庫(kù)中的維表和事實(shí)表
知識(shí)點(diǎn)總結(jié)——數(shù)倉(cāng)表一覽
總結(jié)
以上是生活随笔為你收集整理的update 两个表关联_你真的了解全量表,增量表及拉链表吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: db和model用哪个开发大型项目 th
- 下一篇: mvd没什么每次参数双都多一个逗号_学服