緩慢變化維 - 理論與實(shí)踐

月亮的變化.jpg

介紹

概念

? Slowly Changing Dimensions

? 在現(xiàn)實(shí)世界中,維度的屬性并不是靜態(tài)的巩掺,它會(huì)隨著時(shí)間的流失發(fā)生緩慢的變化偏序。這種隨時(shí)間發(fā)生變化的維度我們一般稱之為緩慢變化維,并且把處理維度表的歷史變化信息的問(wèn)題稱為處理緩慢變化維的問(wèn)題胖替,有時(shí)也簡(jiǎn)稱為處理SCD的問(wèn)題研儒。

應(yīng)用場(chǎng)景

? 支持對(duì)于歷史數(shù)據(jù)的追溯,Inmon對(duì)于數(shù)倉(cāng)的定義已成為公認(rèn)独令。而數(shù)倉(cāng)是這么考慮的:在企業(yè)管理和決策中面向主題的端朵、集成的、與時(shí)間相關(guān)的记焊、不可修改的數(shù)據(jù)集合逸月。

處理方式

緩慢變化維.png

如何使用

-- 通過(guò)對(duì)開始和結(jié)束時(shí)間的限定栓撞,獲取指定時(shí)間點(diǎn)數(shù)據(jù)情況
select name
from tableA 
where begin_time<='2019-06-02' and end_time>='2019-06-02'

存在的問(wèn)題

  1. 數(shù)據(jù)重復(fù)

    處理數(shù)據(jù)時(shí)遍膜,總會(huì)有各種各樣的情況導(dǎo)致數(shù)據(jù)更新失敗或錯(cuò)誤。這個(gè)時(shí)候瓤湘,需要對(duì)應(yīng)的腳本支持?jǐn)?shù)據(jù)重跑瓢颅。在緩慢變化維中,由于保留歷史數(shù)據(jù)弛说,如何保證重跑數(shù)據(jù)時(shí)保障數(shù)據(jù)正確性挽懦、不會(huì)大的變化。

  2. 存儲(chǔ)與性能

    緩慢變化維記錄整個(gè)歷史數(shù)據(jù)木人,數(shù)據(jù)會(huì)以增量的方式進(jìn)行擴(kuò)張信柿。隨著時(shí)間推移冀偶,數(shù)據(jù)就會(huì)越來(lái)越多。查詢的效率也會(huì)隨之面臨挑戰(zhàn)渔嚷。

  3. 應(yīng)用的邊界

    數(shù)據(jù)的變化是不可避免的进鸠,在處理數(shù)據(jù)時(shí)哪些是必須要使用,那么可用可不用形病。如何選擇

實(shí)踐應(yīng)用

基礎(chǔ)數(shù)據(jù)

變化-基礎(chǔ)數(shù)據(jù).png

處理方式a

? 目標(biāo) 記錄數(shù)據(jù)變化軌跡客年,支持?jǐn)?shù)據(jù)重跑

-- 更新已有數(shù)據(jù)
insert overwrite table temp_db.temp_scd_checking
select 
 a.id
,a.name
,a.money
,a.status
,a.begin_time
,case when b.id is not null and a.end_time='9999-09-09' then date_sub('${dealDate}',1) else a.end_time end as end_time
from temp_db.temp_scd_checking as a
left join (
  select 
   id
  from temp_db.temp_scd_source_data
  where p_dt='${dealDate}'
) as b on a.id=b.id
;

-- 插入新數(shù)據(jù)
insert overwrite table temp_db.temp_scd_checking
select 
 case when a.id is not null then a.id else b.id end as id
,case when a.id is not null then a.name else b.name end as name
,case when a.id is not null then a.money else b.money end as money
,case when a.id is not null then a.status else b.status end as status
,case when a.id is not null then '${dealDate}' else b.begin_time end as begin_time
,case when a.id is not null then '9999-09-09' else b.end_time end as end_time
from (
select 
   id
  ,name
  ,money
  ,status
  ,p_dt
  from temp_db.temp_scd_source_data
  where p_dt='${dealDate}'
) as a
full join (
  select 
   *
  from temp_db.temp_scd_checking 
  where end_time='9999-09-09'
) as b on a.id=b.id

-- 歷史去除重復(fù)(by: sunhj)
union all
select 
 id
,name
,money
,status
,begin_time
,end_time
from temp_db.temp_scd_checking 
where end_time<>'9999-09-09'
group by 
  id
 ,name
 ,money
 ,status
 ,begin_time
 ,end_time
 ;

結(jié)果

方式a執(zhí)行結(jié)果.png

重跑結(jié)果(0602-0604)

方式a重跑.png

處理方式b

目標(biāo) 方式a中處理效果太差,時(shí)間漠吻、腳本都太長(zhǎng)量瓜。進(jìn)行優(yōu)化

-- 支持歷史重刷 (by sunhj)
insert overwrite table temp_db.temp_scd_checking
select 
 a.id
,a.name
,a.money
,a.status
,a.begin_time
,case when b.id is not null and a.end_time='9999-09-09' then date_sub('${dealDate}',1) else a.end_time end as end_time
from 
(
  select 
   id
  ,name
  ,money
  ,status
  ,begin_time
  ,case when begin_time=date_sub('${dealDate}',1) then '9999-09-09' else end_time end as end_time
  from temp_db.temp_scd_checking
  where begin_time<'${dealDate}'
) as a 
left join (
  select
   id
  from temp_db.temp_scd_source_data
  where p_dt='${dealDate}'
) as b on a.id=b.id
;

-- 更新數(shù)據(jù) (by sunhj)
insert overwrite table temp_db.temp_scd_checking
select 
 case when a.id is not null then a.id else b.id end as id
,case when a.id is not null then a.name else b.name end as name
,case when a.id is not null then a.money else b.money end as money
,case when a.id is not null then a.status else b.status end as status
,case when a.id is not null then a.begin_time else b.begin_time end as begin_time
,case when a.id is not null then a.end_time else b.end_time end as end_time
from (
select 
   id
  ,name
  ,money
  ,status
  ,'${dealDate}' as begin_time
  ,'9999-09-09' as end_time
  from temp_db.temp_scd_source_data
  where p_dt='${dealDate}'
) as a
full join temp_db.temp_scd_checking as b on a.id=b.id and b.end_time='9999-09-09'
;

結(jié)果略.

優(yōu)劣對(duì)比

處理方式a 處理方式b
代碼簡(jiǎn)潔與可讀性
執(zhí)行效率 低(基于hive语淘,增加近80%的時(shí)間延遲)
數(shù)據(jù)重跑 支持 支持
重跑臟數(shù)據(jù) 無(wú)

總結(jié): 建議方式b處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滓侍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碰声,更是在濱河造成了極大的恐慌欺劳,老刑警劉巖唧取,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異划提,居然都是意外死亡枫弟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鹏往,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淡诗,“玉大人,你說(shuō)我怎么就攤上這事伊履『荩” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵唐瀑,是天一觀的道長(zhǎng)群凶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哄辣,這世上最難降的妖魔是什么请梢? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮力穗,結(jié)果婚禮上毅弧,老公的妹妹穿的比我還像新娘。我一直安慰自己当窗,他們只是感情好够坐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般元咙。 火紅的嫁衣襯著肌膚如雪梯影。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天庶香,我揣著相機(jī)與錄音光酣,去河邊找鬼。 笑死脉课,一個(gè)胖子當(dāng)著我的面吹牛救军,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倘零,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唱遭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了呈驶?” 一聲冷哼從身側(cè)響起拷泽,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袖瞻,沒(méi)想到半個(gè)月后司致,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聋迎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年脂矫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霉晕。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庭再,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牺堰,到底是詐尸還是另有隱情拄轻,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布伟葫,位于F島的核電站恨搓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏筏养。R本人自食惡果不足惜斧抱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撼玄。 院中可真熱鬧夺姑,春花似錦墩邀、人聲如沸掌猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荔茬。三九已至废膘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慕蔚,已是汗流浹背丐黄。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孔飒,地道東北人灌闺。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坏瞄,于是被迫代替她去往敵國(guó)和親桂对。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354