業務部門提了使用者分層的需求,其中有一點,業務放需要我們數倉提供歷史資料,並且業務庫里的部分表還沒有資料更新時間字段。所以本篇文章主要解決兩個問題
1:問題一 怎麼再hive裡實現拉鍊表
2:問題二 怎麼再沒有資料更新時間欄位的情況下獲取增量資料(個人認為這個方式也是一種通用的方式)
1:是什麼? 拉鍊表是一張記錄事務歷史變化的表,記錄乙個事務從開始到當前發生的所有變化。
2:場景:我們需要獲取使用者的歷史資料
3: 原理:所有資料=全量資料 + 變更資料
以下是我實現拉鍊表的過程,為了實驗方便使用with as語句模擬了資料
-- 1:生成實驗資料
with user_1 as (select -- 表1:全量資料
'zhangshan' as uid,123456 as phone, '1' as *** ,'2020-03-24' as start_time,'9999-12-30' as end_time
),user_2 as (select -- 表2:增量資料(使用者的性別出現了便跟)
'zhangshan' as uid,123456 as phone, '0' as ***
) -- 2: 實現拉鍊
select *
from (--全量資料集: 修改歷史資料的截至時間
select a.uid,a.phone,a.***,a.start_time,current_date() as end_time
from user_1 a
left join user_2 b on a.uid=b.uid
) cunion all -- all_data=全量資料集+增量資料集
select --增量資料集:給最新資料集加上start_time,end_time
d.*,current_date() as start_time,'9999-12-30' as end_time from user_2 d
表1:全量資料
表2:增量資料
1:如何獲取增量資料?
1.1:思路一:根據時間子段,增量同步-(我們很多表是沒有資料跟新時間欄位的)
1.2:思路二:監控日誌??(難度會比較大,需要入侵資料庫日誌,開發的工作量也會大)
1.3:思路三:獲取每天獲得乙份切偏資料,然後用兩天的切片資料去對比,就能找出最新的變更。
1.3.1:對比方式1: except方式:但是需要hive2.3.0才支援,我們環境的hive是1.1.0
1.3.2:對比方式2: concat+md5
with user_1 as (select -- 2020-04-23的切片資料
'zhangshan' as uid,123456 as phone, '1' as ***
),user_2 as (select -- 2020-04-22的切片資料
'zhangshan' as uid,123456 as phone, '0' as ***
) -- 對邊兩天的切片資料,找出資料的變化點
select a.uid,a.all_filed,b.all_filed
from(--
select
uid,concat(uid,phone,***) --拼接需要對比的字段
as all_filed,
md5(concat(uid,phone,***)) as f1
from user_1
)aleft join (
select uid,concat(uid,phone,***) as all_filed,md5(concat(uid,phone,***)) as f1 from user_2
)b on a.uid=b.uid
where a.f1<>b.f1
hive 資料倉儲之拉鍊表
先去看這篇文章 首先,下面的user表沒有用到。而且貌似也沒有用,文章中為什麼要user表我也搞不懂。明明user的拉鍊表可以就包含了user全量表的資料了。由於hdfs和hive的底層因素,不支援修改操作。所以修改資料只能先把資料查詢出來,修改完後再覆蓋原本的資料。我對上述insert sql的理...
資料倉儲 緩慢漸變維 拉鍊表
緩慢漸變維 維度會隨著時間發生緩慢的變化。處理方式 全量快照 拉鍊表全量快照很簡單,今天我們來看看拉鍊表。拉鍊表是處理緩慢漸變維的一種方式,它區別於正常的表而言,會多兩個字段,start date和end date,代表這條資料的起始時間和結束時間。如 james同學哪天想不開了,他從男的變成了女的...
資料倉儲歷史資料儲存 拉鍊表
假如我們有乙個賬號account表,我們需要在hive中儲存 資料是從線上mysql讀取binlog同步來的,是有明細變化的 account表結構 account id,username,followers count,modified at我們經常使用的儲存方式有快照表和流水表。快照表就是以時間為...