hive內部表和外部表的區別 HIVE拉鍊表實現

2021-10-11 09:00:40 字數 2808 閱讀 3846

拉鍊表是針對資料倉儲設計中表儲存資料的方式而定義的,主要是維護歷史狀態,以及最新狀態資料的一種表,拉鍊表根據拉鍊粒度的不同,實際上相當於快照,只不過做了優化,去除了一部分不變的記錄,通過拉鍊表可以很方便的還原出拉鍊時點的客戶記錄。

拉鍊表相對來說應用場景比較有限,一般使用hive的分割槽表、或者全量、增量更新表或者儲存快照方便之後查詢。

全量表:每天的所有的最新狀態的資料;

增量表:每天的新增資料;

拉鍊表:維護歷史狀態,以及最新狀態資料;

流水表:對於表中的每乙個修改都會記錄,可以用於反映實際記錄的變更;

拉鍊歷史表,既能滿足反應資料的歷史狀態,又可以最大程度的節省儲存。

那麼對於這種表我該如何設計呢?下面有幾種方案可選:

現在我們對前面提到的三種進行逐個的分析。

方案一

這種方案就不用多說了,實現起來很簡單,每天drop掉前一天的資料,重新抽乙份最新的。

優點很明顯,節省空間,一些普通的使用也很方便,不用在選擇表的時候加乙個時間分割槽什麼的。

缺點同樣明顯,沒有歷史資料,先翻翻舊賬只能通過其它方式,比如從流水表裡面抽。

方案二

每天乙份全量的切片是一種比較穩妥的方案,而且歷史資料也在。

缺點就是儲存空間佔用量太大太大了,如果對這邊表每天都保留乙份全量,那麼每次全量中會儲存很多不變的資訊,對儲存是極大的浪費。

當然我們也可以做一些取捨,比如只保留近乙個月的資料?但是,需求是無恥的,資料的生命週期不是我們能完全左右的。

此時可以考慮使用拉鍊表。首先它在空間上做了乙個取捨,雖說不像方案一那樣佔用量那麼小,但是它每日的增量可能只有方案二的千分之一甚至是萬分之一。其次它能滿足方案二所能滿足的需求,既能獲取最新的資料,也能新增篩選條件也獲取歷史的資料。

有一張使用者表

在2017-01-01這一天表中的資料是:

在2017-01-02這一天表中的資料是, 使用者002和004資料進行了修改,005是新增使用者:

在2017-01-03這一天表中的資料是, 使用者004和005資料進行了修改,006是新增使用者:

如果在資料倉儲中設計成歷史拉鍊表儲存該錶,則會有下面這樣一張表,這是最新一天(即2017-01-03)的資料:

說明

資料基本上都是每天全量同步,那麼怎麼來實現拉鍊表呢。

ods層的店鋪資料表的結構如下(沒有快照,只存乙份,所以一旦查歷史的快照很麻煩):

create
建立拉鍊表

create external table if not exists db_business.ods_shp_zipper_target_dd

( id int comment '主鍵',

shop_code string comment '店鋪code',

shop_name string comment '店鋪名稱',

date_create timestamp comment '建立時間',

date_update timestamp comment '更新時間',

date_delete timestamp comment '刪除時間',

t_start string comment '該條記錄的生命週期開始時間',

t_end string comment '該條記錄的生命週期開始時間'

)comment '店鋪的健康目標拉鍊表--tes'

row format delimited

null defined as ""

stored as textfile

insert overwrite table db_business.ods_shp_zipper_target_dd

select id,

shop_code,

shop_name,

date_create,

date_update,

date_delete,

'#yesterday_ds#' as t_start,

'9999-12-31' as t_end

from db_business.ods_shp_target_dd

**實現邏輯

1、查詢拉鍊表中的資料在ods表中哪些被刪除了,將所有刪除的資料t_end時間改為當天。

2、拉鍊表去除刪除的資料,在union已經將刪除的資料t_end時間改為當天的資料。

3、在union ods表後distinct 變成一張新錶。

4、對這張新表查詢t_start is null就為每天有變化的資料,將t_end改為9999-12-31。

5、在判斷哪些資料是新增的,哪些是更新的,將更新的資料 中的歷史資料t_end改為當天。

流程圖如下:

這個實現的邏輯是基於hive表來實現的,相對來說比較繁瑣,正常的業務邏輯可以通過mysql事務去更新這類資料。

hive內部表和外部表的區別 內部表和外部表

內部表 create table if not exists table name刪除表時,元資料與資料都會被刪除 外部表 create external table if not exists table name location hdfs path刪除外部表只刪除metastore的元資料,不...

Hive內部表和外部表區別

建立內部表 建立 create table art inn sentence string row format delimited fields terminated by n 匯入 建立外部表 注意 外部表是在建立的時候定義實體資料的位置的,而且位置必須為資料夾,不能為檔案。1 匯入資料時 在匯...

Hive內部表和外部表的區別

建立 內部表 內部表直接建立,不需要加關鍵字 create table ifnot exits xm testa kehumc varchar 50 comment 客戶名稱 kehuzh varchar 50 comment 客戶號 comment 客戶資訊表 外部表 外部表的建立需要加上exte...