三段式開發:
一、開頭
====step:0====
drop table if exists platform_temp.sr_dw_commodity_item_info_base_${dt};
create table platform_temp.sr_dw_commodity_item_info_base_${dt}
(
? `commodity_id` bigint,
? `attr_key` string,
? `attr_value` string
)
PARTITIONED BY
(
? `step` string
)
;
說明:
建立類似長表的臨時分區表,作為中間過渡層,以便獨立開發各個指標,最后匯總。
臨時分區表為了支持并發刷數據,拼接了日期參數在表名中。
二、中間
====step:1====
drop table if exists platform_temp.sr_dw_commodity_item_info_base_category_01_${dt};
create table platform_temp.sr_dw_commodity_item_info_base_category_01_${dt}
as
select ……; --寬表
====step:1====
drop table if exists platform_temp.sr_dw_commodity_item_info_base_category_02_${dt};
create table platform_temp.sr_dw_commodity_item_info_base_category_02_${dt}
as
select ……; --寬表
====step:2====
insert overwrite table platform_temp.sr_dw_commodity_item_info_base_${dt} partition(step='category_info')
select
? ? commodity_id,
? ? 'category_info' as attr_key,
? ? category_info attr_value
from
(
? ? select ……
? ? from
? ? ? ? platform_temp.sr_dw_commodity_item_info_base_category_01_${dt} t1
? ? left join
? ? ? ? platform_temp.sr_dw_commodity_item_info_base_category_02_${dt} t2
? ? on ……
)tt
;
====step:1====
insert overwrite table platform_temp.sr_dw_commodity_item_info_base_${dt} partition(step='item_sku')
select
? ? commodity_id,
? ? split(index,'=:=')[0] as attr_key,
? ? split(index,'=:=')[1] as attr_value
from ……;
說明:
1.中間層可以建立很多常規的臨時寬表作為過渡表方便數據處理;
2.中間層每個step分區作為一個指標集開發空間,互相獨立可以設置為并發執行;
3.一張寬表的多個字段提取需要用到列轉行,拼接處理時用到符號“=:=”,因為可能處理的是一個字符類型的字段,其中很可能包含如“=”、“#”等簡單字符,在split處理時會分隔異常。
三、結尾
====step:3====
insert overwrite table platform_dw.platform_dw_sr_dw_user_item_info partition(dt='${day}',label='base')
select
? ? user_id,attr_key,attr_value
from
? ? platform_temp.sr_dw_user_item_info_base_${dt} t1
left semi join
(
? ? select user_id from platform_dw.platform_dw_sr_dw_user_main
? ? where dt='${day}'
) t2
on t1.user_id = t2.user_id
where nvl(trim(attr_value),'')<>''
;
insert overwrite table platform_dw.platform_dw_sr_dw_feature_log partition(dt='${day}',label='base')
select
? ?attr_key,
? ?count(*) as coverage,
? ?from_unixtime(unix_timestamp()) as update_time
from
(
? ? select attr_key,user_id from platform_dw.platform_dw_sr_dw_user_item_info
? ? where dt='${day}'and label='base'
) t
group by attr_key
;
說明:
1.因為中間表和目標表都是長表,所以不限制分區就可以直接取到所有中間結果,不用關聯,性能高效。
2.將臨時分區表中的數據主鍵關聯各大維度的主表,限制記錄數后直接插入到開發層長表的指定label分區中。
并過濾掉無意義的數據:
? 1> 在寬表中為null值的字段,經過列轉行后生成的指標名為null的記錄。
? 2> 字段值本身為空字符串'',或字段值只包含多個空格的記錄
3.基于過濾后的數據,統計任務生成的指標覆蓋了多少主鍵,并記錄下更新時間,插入日志表中。