hive中拉鏈表

在有些情況下,為了保持歷史的一些狀態(tài)谴轮,需要用拉鏈表來做,這樣做目的在可以保留所有狀態(tài)的情況下可以節(jié)省空間吹埠。

拉鏈表適用于以下幾種情況吧

數(shù)據(jù)量有點大第步,表中某些字段有變化,但是呢變化的頻率也不是很高缘琅,業(yè)務(wù)需求呢又需要統(tǒng)計這種變化狀態(tài)粘都,每天全量一份呢,有點不太現(xiàn)實刷袍,

不僅浪費(fèi)了存儲空間翩隧,有時可能業(yè)務(wù)統(tǒng)計也有點麻煩,這時呻纹,拉鏈表的作用就提現(xiàn)出來了堆生,既節(jié)省空間,又滿足了需求雷酪。

一般在數(shù)倉中通過增加begin_date,en_date來表示淑仆,如下例,后兩列是start_date和end_date.

1 2016-08-20 2016-08-20 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 2016-08-22 9999-12-31

begin_date表示該條記錄的生命周期開始時間哥力,end_date表示該條記錄的生命周期結(jié)束時間蔗怠;

end_date = ‘9999-12-31’表示該條記錄目前處于有效狀態(tài)墩弯;

如果查詢當(dāng)前所有有效的記錄,則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’

再簡單介紹一下拉鏈表的更新:

假設(shè)以天為維度渔工,以每天的最后一個狀態(tài)為當(dāng)天的最終狀態(tài)。

以一張訂單表為例桥温,如下是原始數(shù)據(jù)引矩,每天的訂單狀態(tài)明細(xì)

1 2016-08-20 2016-08-20 創(chuàng)建

2 2016-08-20 2016-08-20 創(chuàng)建

3 2016-08-20 2016-08-20 創(chuàng)建

1 2016-08-20 2016-08-21 支付

2 2016-08-20 2016-08-21 完成

4 2016-08-21 2016-08-21 創(chuàng)建

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 創(chuàng)建

根據(jù)拉鏈表我們希望得到的是

1 2016-08-20 2016-08-20 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 2016-08-22 9999-12-31

可以看出 1,2策治,3脓魏,4每個訂單的狀態(tài)都有,并且也能統(tǒng)計到當(dāng)前的有效狀態(tài)通惫。

本例以hive為例,只考慮到實現(xiàn)混蔼,與性能無關(guān)

首先創(chuàng)建表

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

首先全量更新履腋,我們先到2016-08-20為止的數(shù)據(jù)。

初始化惭嚣,先把2016-08-20的數(shù)據(jù)初始化進(jìn)去

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

如下結(jié)果

select * ``from dw_orders_his;

OK

1 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 9999-12-31

2 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 9999-12-31

3 2016-08-20 2016-08-20 創(chuàng)建 2016-08-20 9999-12-31

剩余需要進(jìn)行增量更新

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 創(chuàng)建 2016-08-21

先放到增量表中遵湖,然后進(jìn)行關(guān)聯(lián)到一張臨時表中,在插入到新表中

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;

在根據(jù)上面步驟把2016-08-22號的數(shù)據(jù)更新進(jìn)去晚吞,最后結(jié)果如下

select * ``from dw_orders_his;

OK

1 2016-08-20 2016-08-20 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 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 創(chuàng)建 2016-08-22 9999-12-31

至此延旧,就得到了我們想要的數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末槽地,一起剝皮案震驚了整個濱河市迁沫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌蚊,老刑警劉巖集畅,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缅糟,居然都是意外死亡挺智,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門窗宦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赦颇,“玉大人,你說我怎么就攤上這事赴涵∶角樱” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵句占,是天一觀的道長沪摄。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么杨拐? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任祈餐,我火速辦了婚禮,結(jié)果婚禮上哄陶,老公的妹妹穿的比我還像新娘帆阳。我一直安慰自己,他們只是感情好屋吨,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布蜒谤。 她就那樣靜靜地躺著,像睡著了一般至扰。 火紅的嫁衣襯著肌膚如雪鳍徽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天敢课,我揣著相機(jī)與錄音阶祭,去河邊找鬼。 笑死直秆,一個胖子當(dāng)著我的面吹牛濒募,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圾结,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瑰剃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筝野?” 一聲冷哼從身側(cè)響起晌姚,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遗座,沒想到半個月后舀凛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡途蒋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年猛遍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片号坡。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡懊烤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宽堆,到底是詐尸還是另有隱情腌紧,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布畜隶,位于F島的核電站壁肋,受9級特大地震影響号胚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浸遗,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一猫胁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跛锌,春花似錦弃秆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至郑藏,卻和暖如春衡查,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背译秦。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工峡捡, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筑悴。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像稍途,于是被迫代替她去往敵國和親阁吝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 使用Hive實現(xiàn)時間拉鏈功能 - 菠蘿大數(shù)據(jù)夢工廠(Free World) - 博客頻道 - CSDN.NET ...
    葡萄喃喃囈語閱讀 865評論 0 1
  • 摘要: 簡單的拉鏈表設(shè)計 背景信息: 在數(shù)據(jù)倉庫的數(shù)據(jù)模型設(shè)計過程中械拍,經(jīng)常會遇到這樣的需求: 數(shù)據(jù)量比較大; 表中...
    貓耳呀閱讀 759評論 0 0
  • 2017/3/14 RDBMS:關(guān)系型數(shù)據(jù)庫管理系統(tǒng) 關(guān)系模型獨立于語言 SQL有幾種不同類型的語言:數(shù)據(jù)定義語言...
    ancherl閱讀 1,629評論 0 6
  • 今天早上老師讓舉手誰是笨鳥先飛的人突勇,我立即舉起手來。雖然我不聰慧坷虑,但是我很熱愛學(xué)習(xí)甲馋。尤其是跟隨鈞嵐老師的學(xué)習(xí)讓...
    張艷紅_feed閱讀 187評論 0 0
  • 6月30日 運(yùn)動:健身走 讀書:未讀 時間利用:上午健身跑,趕集迄损,汶泰定躏、田海超來家吃飯;下午帶萊萊在小區(qū)玩 手機(jī)使...
    窩窩頭_6145閱讀 53評論 0 0