1. 初始化一次全量資料到歷史拉鍊表中【只做一次操作就好】
2. 歷史拉鍊表與每日的日增量資料做merge操作
3.關閉拉鍊的時間視窗
業務場景:
公司內部,員工的職級會隨著時間的變化發生緩慢的變化,例如: 公升職、離職等;
針對此情況,採用拉鍊表的方式既可保留歷史,也不影響使用。
準備材料:
1. 員工表
create table biz_emp (
emp_id string comment '員工id',
emp_name string comment '員工名稱',
org_id string comment '組織id',
emp_score double comment '員工得分',
emp_posi string comment '員工崗位,此維度屬性為會發生緩慢變化',
createtime string ,
modifytime string
) comment '員工表'
partitioned by (ds string comment 'yyyymmdd')
row format delimited
fields terminated by '\t'
lines terminated by '\n'
stored as textfile
;
2. 關於員工資訊的拉鍊表
create table zipper_biz_emp (
emp_id string comment '員工id',
emp_name string comment '員工名稱',
org_id string comment '組織id',
emp_score double comment '員工得分',
emp_posi string comment '員工崗位',
createtime string ,
modifytime string
) comment '員工表'
row format delimited
fields terminated by '\t'
lines terminated by '\n'
stored as textfile
;-- 拉鍊表的臨時表
create table if not exists tmp_zipper_biz_emp like zipper_biz_emp ;
操作步驟利用datax工具全量抽取某乙個時間節點之前的資料到員工表biz_emp 的指定分割槽中;此操作只做一次即可以時間點: 2019-07-25 為例
2. 將全量資料初始化到 歷史拉鍊表中 zipper_biz_emp ; 此操作也僅僅只需做一次即可
insert overwrite table zipper_biz_emp
select
emp_id
, emp_name
, org_id
, emp_score
, emp_posi
, date_format(createtime,'yyyymmdd') as start_date
, 99991231 as end_date
from biz_emp
where ds = 20190725
;
3. 按照時間字段抽取日增量的資料到biz_emp 的每乙個增量分割槽中; 此操作需要打包成job,週期性的執行
4. 將 拉鍊表 zipper_biz_emp 和 日增量表做merge操作,merge後的結果灌入臨時表tmp_zipper_biz_emp中;
*** 此過程中啟動「開拉鍊」 操作,注意end_date 字段值的變化
*** 「開拉鍊」操作完成後,由於要保留變化的歷史記錄,需要利用日增量表biz_emp的增量資料,做「關拉鍊」操作,注意觀察start_date 和 end_date 字段值的變化
tips:
1. 如果某一名員工一天之內多次職位變更,則取這一天最後一次職位變更的記錄。
2. 我使用的hive 是1.1 還不支援 union 操作, 因此: 為防止job重複執行導致的資料重複,這裡對最後的結果進行了去重。hive1.2 之後的版本可直接使用union 操作,**會更加簡化。
insert overwrite table tmp_zipper_biz_emp
select
t1.emp_id
, max(t1.emp_name)
, max(t1.org_id)
, max(t1.emp_score)
, t1.emp_posi
, t1.start_date
, t1.end_date
from(
select
t1.emp_id
, t1.emp_name
, t1.org_id
, t1.emp_score
, t1.emp_posi
, t1.start_date
, case when t2.emp_id is not null and t1.end_date = '99991231' then $
else t1.end_date
end as end_date
from zipper_biz_emp t1
left outer join (
-- 如果乙個員工一天只能連公升多級,則去最後一次「公升值」記錄
select
t1.*
from(
select *,
row_number() over(partition by emp_id,emp_name order by modifytime desc ) as modifytime_desc_rank
from biz_emp t
where ds = '$'
) t1
where t1.modifytime_desc_rank = 1
) t2
on t2.ds = '$'
and t1.emp_id = t2.emp_id
and t1.emp_name = t2.emp_name
union all
select
t1.emp_id
, t1.emp_name
, t1.org_id
, t1.emp_score
, t1.emp_posi
, date_format(modifytime,'yyyymmdd') as start_date
, 99991231 as end_date
from biz_emp t1
where t1.ds = '$'
) t1
group by
t1.emp_id
, t1.emp_posi
, t1.start_date
, t1.end_date
;
5. 臨時表 tmp_zipper_biz_emp 資料灌入拉鍊表即可
insert overwrite table zipper_biz_emp
select * from tmp_zipper_biz_emp
;-- 清空臨時表
truncate table tmp_zipper_biz_emp ;
hive使用適用場景 hive的典型應用場景
案例一 需求 現有這麼一批資料,現要求出 每個使用者截止到每月為止的最大單月訪問次數和累計到該月的總訪問次數。資料 使用者名稱,月份,訪問次數 a,2015 01,5 a,2015 01,15 b,2015 01,5 a,2015 01,8 b,2015 01,25 a,2015 01,5 a,20...
hive架構及使用場景
一 什麼是hive,它能解決什麼問題?hive是乙個基於hadoop的資料倉儲平台。它通過hdfs進行儲存,通過mapreduce執行查詢計畫,使用類sql的查詢語言hql作為查詢介面。作用 可以很方便我們進行資料的etl工作,避免了使用mapreduce來做如此複雜事情。二 hive的架構 三 h...
Hive拉鍊表設計方案
定義 所謂拉鍊,就是記錄歷史。記錄乙個事物從開始,一直到當前狀態的所有變化的資訊。使用場景 舉個栗子,現有一張內含1000萬資料的訂單表,每天都有100左右的訂單狀態會變化,因業務需求要回溯某個歷史節點的一筆訂單的狀態。現有兩種處理方式 1.比較原始的做法,對每天的資料做切片表,檢視對應時間的切片表...