錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠服務(wù),錦州廣廈維修電腦,公司IT外包服務(wù)
topFlag1 設(shè)為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務(wù)項目 服務(wù)報價 維修流程 IT外包服務(wù) 服務(wù)器維護 技術(shù)文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統(tǒng)|0416-3905144熱誠服務(wù)技術(shù)文章
hive 拉鏈表設(shè)計與實現(xiàn)

作者: 佚名  日期:2023-07-14 20:43:40   來源: 本站整理

一、前言

做過電商開發(fā)的同學對訂單的業(yè)務(wù)應該不陌生,比如對一條訂單數(shù)據(jù)來說,通常會有一個類似于status的字

段來標識這個訂單的完整的生命周期,從存儲的數(shù)據(jù)來看,一張表只需要存儲這一條數(shù)據(jù)即可。

 

但是對于數(shù)據(jù)分析來看,為了跟蹤這個訂單的全生命周期的完整過程來說,這并不是一個很好的設(shè)計,假如說訂

單到已支付但未發(fā)貨,而且在未發(fā)貨這一步停留的時間很長,對于大數(shù)據(jù)分析場景來說,這就是一個重要的分析

場景,但對于mysql存儲的訂單表來說,這就有些冗余了。這也就是說,mysql在設(shè)計表的時候,是會充分考慮

冗余數(shù)據(jù)量帶來的性能問題。

 

二、拉鏈表業(yè)務(wù)背景

 

我們知道,Hive在實際工作中主要用于構(gòu)建離線數(shù)據(jù)倉庫,定期的從各種數(shù)據(jù)源中同步采集數(shù)據(jù)到Hive中,

經(jīng)過分層轉(zhuǎn)換提供數(shù)據(jù)給上層其他應用使用。

 

例如:有一個定時任務(wù)每天從MySQL中同步最新的訂單信息、用戶信息、店鋪信息等到數(shù)據(jù)倉庫中,從而進行訂單分析、用戶分析等。

 

如下圖所示,為一個數(shù)倉簡單的業(yè)務(wù)流程圖;

 

2.1 數(shù)據(jù)同步引發(fā)的問題

 

有下面這樣一張用戶表tb_user,有過開發(fā)經(jīng)驗的同學對類似的訂單表應該不陌生,比如每次注冊完一個用戶后,該表中就會產(chǎn)生一條新

的數(shù)據(jù),記錄了該用戶的id、手機號碼、用戶名、性別、地址等信息。

 

關(guān)于該表在業(yè)務(wù)中的具體使用場景如下:

  • 每天都會有用戶注冊,產(chǎn)生新的用戶信息;
  • 每天都需要將MySQL中的用戶數(shù)據(jù)同步到Hive數(shù)據(jù)倉庫中;
  • 需要對用戶的信息做統(tǒng)計分析,例如統(tǒng)計新增用戶的個數(shù)、用戶性別分布、地區(qū)分布、運營商分布等指標;

 

數(shù)據(jù)同步的過程大概長下面這樣

 比如說,在2021-01-01這一天,MySQL中有10條用戶信息;

 

然后通過中間程序(或其他方式)同步到下面的Hive表中了;

 

現(xiàn)在,假如在 2021-01-02 這一天,在前一天的基礎(chǔ)上,MySQL中新增了2條用戶注冊數(shù)據(jù),并且其中有1條用戶數(shù)據(jù)發(fā)生更新,

  • 新增兩條用戶數(shù)據(jù)011和012;
  • 008的addr發(fā)生了更新,從gz更新為sh;

 

到了2021-01-03這天,Hive需要對2號的數(shù)據(jù)進行同步更新處理,此時問題來了:

新增的數(shù)據(jù)會直接加載到Hive表中,但是更新的數(shù)據(jù)如何存儲在Hive表中?

 

2.1.1 解決方案1

在Hive中用新的addr覆蓋008的老的addr,直接更新

 這么做的優(yōu)點是:實現(xiàn)最簡單,使用起來最方便,但缺點也是很明顯的,沒有歷史狀態(tài),008的地址是1月2號在sh

,但是1月2號之前是在gz的,如果要查詢008的1月2號之前的addr就無法查詢,也不能使用sh代替;

 

2.1.2 解決方案2

每次數(shù)據(jù)改變,根據(jù)日期構(gòu)建一份全量的快照表,每天一張表

這樣做的優(yōu)點是:記錄了所有數(shù)據(jù)在不同時間的狀態(tài), 缺點:冗余存儲了很多沒有發(fā)生變化的數(shù)據(jù),導致存儲的數(shù)據(jù)量過大;

 

2.1.3 解決方案3

 

構(gòu)建拉鏈表,通過時間標記發(fā)生變化的數(shù)據(jù)的每種狀態(tài)的時間周期,如下圖表中數(shù)據(jù)所示,

它大意就是,當一條數(shù)據(jù)中的關(guān)鍵業(yè)務(wù)標識字段發(fā)送了變化,將新增加一條數(shù)據(jù),將這

條數(shù)據(jù)的過期時間設(shè)置的非常大,作為這條數(shù)據(jù)的邊界,同樣主鍵的數(shù)據(jù)再次過來的時

候,在新增的一條記錄中只需要記錄變化的字段即可;關(guān)于拉鏈表,下文將做詳細的講述;

 

三、拉鏈表設(shè)計與原理

 

3.1 功能與應用場景

拉鏈表專門用于解決在數(shù)據(jù)倉庫中數(shù)據(jù)發(fā)生變化如何實現(xiàn)數(shù)據(jù)存儲的問題。

拉鏈表的設(shè)計是將更新的數(shù)據(jù)進行狀態(tài)記錄,沒有發(fā)生更新的數(shù)據(jù)不進行狀態(tài)存儲,用于存儲所有

數(shù)據(jù)在不同時間上的所有狀態(tài),通過時間進行標記每個狀態(tài)的生命周期,查詢時,根據(jù)需求可以

獲取指定時間范圍狀態(tài)的數(shù)據(jù),默認用9999-12-31等最大值來表示最新狀態(tài)。

如下圖所示,記錄了某些訂單的完整生命周期;

 

3.2 實現(xiàn)步驟

用下面這張圖來說明其完整的實現(xiàn)過程

具體來說,操作步驟如下:

 

3.2.1 Step1

增量采集變化數(shù)據(jù),放入增量表中。

 

3.2.2  Step2

將Hive中的拉鏈表與臨時表的數(shù)據(jù)進行合并,合并結(jié)果寫入臨時表。

 

3.2.3 Step3

將臨時表的數(shù)據(jù)覆蓋寫入拉鏈表中。

 

3.3 操作演示

 

準備一份原始數(shù)據(jù),內(nèi)容如下

 

3.3.1 創(chuàng)建一張表并加載數(shù)據(jù)

    ——創(chuàng)建拉鏈表createtabledw_zipper(useridstring,phonestring,nickstring,genderint,addrstring,starttimestring,endtimestring)rowformatdelimitedfieldsterminatedby'\t';——加載模擬數(shù)據(jù)loaddatalocalinpath'/usr/local/soft/selectdata/zipper。txt'intotabledw_zipper;

執(zhí)行過程

 檢查數(shù)據(jù)是否加載進去

 

3.3.2 模擬增量數(shù)據(jù)變化

下面為兩條新增的數(shù)據(jù),以及一條變化的數(shù)據(jù)

創(chuàng)建一張增量表,并加載數(shù)據(jù)

    createtableods_zipper_update(useridstring,phonestring,nickstring,genderint,addrstring,starttimestring,endtimestring)rowformatdelimitedfieldsterminatedby'\t';loaddatalocalinpath'/usr/local/soft/selectdata/update。txt'intotableods_zipper_update;

 執(zhí)行過程

檢查數(shù)據(jù)是否加載成功

 

 

3.3.3 合并數(shù)據(jù)

 

創(chuàng)建一張臨時表

    createtabletmp_zipper(useridstring,phonestring,nickstring,genderint,addrstring,starttimestring,endtimestring)rowformatdelimitedfieldsterminatedby'\t';

執(zhí)行過程

 

合并拉鏈表與增量表

    insertoverwritetabletmp_zipperselectuserid,phone,nick,gender,addr,starttime,endtimefromods_zipper_updateunionall——查詢原來拉鏈表的所有數(shù)據(jù),并將這次需要更新的數(shù)據(jù)的endTime更改為更新值的startTimeselecta。userid,a。phone,a。nick,a。gender,a。addr,a。starttime,——如果這條數(shù)據(jù)沒有更新或者這條數(shù)據(jù)不是要更改的數(shù)據(jù),就保留原來的值,否則就改為新數(shù)據(jù)的開始時間-1if(b。useridisnullora。endtime<'9999-12-31',a。endtime,date_sub(b。starttime,1))asendtimefromdw_zipperaleftjoinods_zipper_updatebona。userid=b。userid;

執(zhí)行上面的sql

 

覆蓋拉鏈表

insert overwrite table dw_zipper select * from tmp_zipper;

執(zhí)行過程

執(zhí)行完成后,檢查拉鏈表的數(shù)據(jù),可以看到新增了2條數(shù)據(jù),同時對于相同的那條數(shù)據(jù)做了時間上的更新;



熱門文章
  • 華碩B75m-A主板維修一例
  • iPad Air 4不充電,不開機(PD芯片...
  • 華碩X55JX時不時不觸發(fā)(橋待機供電...
  • 戴爾筆記本恢復出廠設(shè)置恢復原廠系...
  • 開源計算機視覺庫OpenCV詳解
  • hive 拉鏈表設(shè)計與實現(xiàn)
  • 條碼打印機設(shè)置標簽紙大小?打印機驅(qū)...
  • 怎么判斷MySQL中sql語句索引是否生...
  • L1正則化和L2正則化
  • 在Linux系統(tǒng)下,可以使用以下方法和...
  • 主板型號怎么看?小編將給大家介紹...
  • win10在激活界面會提示無法訪問激活...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯(lián)系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務(wù)區(qū)域: 遼寧錦州市區(qū)
    主要業(yè)務(wù): 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網(wǎng)設(shè)置,IT服務(wù)外包,局域網(wǎng)組建,ADSL共享上網(wǎng),路由器設(shè)置,數(shù)據(jù)恢復,密碼破解,光盤刻錄制作等服務(wù)

    技術(shù)支持:微軟等
    主站蜘蛛池模板: 精品久久久无码中文字幕| 熟妇人妻AV无码一区二区三区| 人妻av无码专区| 日韩AV片无码一区二区不卡| 少妇人妻偷人精品无码AV | 久久久g0g0午夜无码精品 | 未满十八18禁止免费无码网站| 无码人妻一区二区三区免费手机| 亚洲AV永久无码精品一福利| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲日韩乱码中文无码蜜桃| 中文字幕乱偷无码av先锋蜜桃| 亚洲一级Av无码毛片久久精品| 色窝窝无码一区二区三区色欲| 国产AV无码专区亚洲AV蜜芽| 人妻系列AV无码专区| 亚洲成a∨人片在无码2023| 国产午夜精华无码网站| 国产精品无码无卡在线观看久| 久久久无码精品亚洲日韩按摩| 亚洲精品国产日韩无码AV永久免费网 | 97精品人妻系列无码人妻| 亚洲人av高清无码| 久久99久久无码毛片一区二区 | 亚洲区日韩区无码区| 亚洲日韩看片无码电影| 久久人妻av无码中文专区| 一道久在线无码加勒比| 亚洲精品无码专区在线| 人妻无码一区二区三区AV| 亚洲av无码潮喷在线观看| 东京热加勒比无码少妇| 无码天堂va亚洲va在线va| 亚洲人AV在线无码影院观看| 久久国产精品无码HDAV | 国产日韩精品中文字无码| 午夜无码中文字幕在线播放| 无码少妇一区二区三区芒果| 亚洲av无码一区二区三区人妖 | 无码视频一区二区三区| 无码国模国产在线观看|