Q:使用DataWorks業務流程搭建100張表結構一緻,僅表名不同的ads結果表的節點,要把sql複制100遍嗎?
A:使用元件,實作代碼複用。
概論
元件:DataWorks上可視化的SQL存儲過程,類似于函數,可将"string類型"、"table類型"的資料作為輸入或輸出參數放到一個SQL語句中。
元件的組成:
- 過程體:即SQL
- 參數:輸入/輸出參數,類型兩種"string類型"和"table類型",在過程體中參數的引用格式為:@@{參數名}
注:系統參數bizdate、cyctime都可使用,與普通odpssql節點使用方法一緻,建立元件時無需配置。
優勢:僅需維護一段sql,實作代碼複用,減少重複開發備援。
實踐
場景:從
通路記錄寬表
中通過sql擷取
**北京**上月活躍使用者表
、
**上海**上月活躍使用者表
**廣州**上月活躍使用者表
三張結果表,這三張結果表的特點是:表結構(字段數,資料類型等)一緻,where篩選時某些條件值不同,表名不同。

業務流程圖概覽:(下圖紅框部分即上圖實作過程,元件應用過程)
将dwd層的三張表
使用者表
産品表
使用者行為表
過濾、連接配接、聚合成一張
dws_log_info
寬表,從這張寬表中過濾出三張表結構一緻的ads結果表,通過離線同步任務導出到MySQL資料庫,為下一步資料分析做準備。
注:元件主要應用在紅框部分,也是本文的主要内容,如需測試,紅框以上資料準備部分請先執行一下文末附錄。
建立元件:
get_city_active_user該元件的作用:建立結果表,将XX城市上個月前N位活躍使用者資料插入結果表,降序。(活躍使用者即點選次數多的使用者)。
step1:編輯元件過程體(忽略這些紅色波浪線,代碼無錯)
step2:配置參數
step3:儲存 送出 公開
--過程體
--結果表模闆 四月XX地區最活躍的使用者(點選數)以及點選自營商品數
DROP TABLE IF EXISTS ads_@@{cityname_pinyin}_month_active_user;
CREATE TABLE IF NOT EXISTS ads_@@{cityname_pinyin}_month_active_user
(
`user_id` STRING COMMENT '使用者id'
,`user_name` STRING COMMENT '使用者名'
,`click_count` STRING COMMENT '點選次數'
,`self_model_count` STRING COMMENT '點選自營商品數'
)
COMMENT '城市上月活躍使用者結果表'
PARTITIONED BY
(
pt STRING
)
;
INSERT OVERWRITE TABLE ads_@@{cityname_pinyin}_month_active_user PARTITION(pt='${bizdate}')
SELECT tb_all_model.user_id
,tb_all_model.user_name
,tb_all_model.action_count action_count
,tb_part_model.model_count model_count
FROM (
SELECT user_id
,user_name
,COUNT(action) action_count
,COUNT(model) model_all_count
FROM dws_log_info
WHERE pt = '${bizdate}'
AND REPLACE(SPLIT_PART(action_time,'-',1,2),'-','') = '${prebizmonth}'
AND city = CAST('@@{cityname_zhongwen}' AS STRING)
AND action = '點選'
GROUP BY user_id
,user_name
) tb_all_model
LEFT JOIN (
SELECT user_id
,user_name
,COUNT(action) action_count
,COUNT(model) model_count
FROM dws_log_info
WHERE pt = '${bizdate}'
AND REPLACE(SPLIT_PART(action_time,'-',1,2),'-','') = '${prebizmonth}'
AND city = '@@{cityname_zhongwen}'
AND action = '點選'
AND model = '自營'
GROUP BY user_id
,user_name
) tb_part_model
ON tb_all_model.user_id = tb_part_model.user_id
ORDER BY action_count DESC
LIMIT @@{topn}
;
--SELECT * FROM ads_@@{cityname_pinyin}_month_active_user WHERE pt='${bizdate}';
使用元件
如下圖建立SQL元件節點,建三個,北京、上海、廣州的節點,選擇之前配置好的元件,配置好參數。
ads_beijing_month_action_user節點
ads_guangzhou_month_action_user節點
ads_shanghai_month_action_user節點
**
檢視結果:北京上個月活躍使用者點選次數以及他們購買自營商品的次數,按點選次數降序。
附錄
dws_log_info表資料準備部分
--元件應用場景案例,實作“一對多”結果表
--源表1使用者表
DROP TABLE IF EXISTS `dwd_user_info_dim` ;
CREATE TABLE IF NOT EXISTS `dwd_user_info_dim`
(
user_id STRING COMMENT '使用者id'
,user_name STRING COMMENT '使用者名'
,age STRING COMMENT '年齡'
,gender STRING COMMENT '性别'
,city STRING COMMENT '城市'
)
COMMENT '使用者資訊表'
;
--源表2商品表
DROP TABLE IF EXISTS `dwd_product_info_dim` ;
CREATE TABLE IF NOT EXISTS `dwd_product_info_dim`
(
product_id STRING COMMENT '商品id'
,product_name STRING COMMENT '商品名'
,model STRING COMMENT '模式'
)
COMMENT '商品資訊表';
--源表3行為表
DROP TABLE IF EXISTS `dwd_user_action` ;
CREATE TABLE IF NOT EXISTS `dwd_user_action`
(
action_id STRING COMMENT '動作通路記錄id'
,user_id STRING COMMENT '使用者id'
,product_id STRING COMMENT '商品id'
,action STRING COMMENT '點選|下單|支付'
,action_time STRING COMMENT '動作發生時刻'
)
COMMENT '使用者行為表'
PARTITIONED BY
(
pt STRING COMMENT '分區'
)
;
-----------------------------
--源表中插入測試資料
INSERT OVERWRITE TABLE `dwd_user_info_dim` VALUES
('001','張三','18','女','北京')
,('002','李四','22','男','北京')
,('003','王五','36','女','北京')
,('004','趙六','36','女','上海')
,('005','孫七','36','男','上海')
,('006','周八','36','男','廣州')
;
INSERT OVERWRITE TABLE `dwd_product_info_dim` VALUES
('A1280','華為手機','自營')
,('B1280','海爾冰箱','三方')
,('C1280','松下洗衣機','自營')
,('D1280','格力空調','三方');
INSERT OVERWRITE TABLE `dwd_user_action` PARTITION (pt='${bizdate}') VALUES
('1122334455000','002','C1280','點選','2020-03-19 11:00:04')
,('1122334455001','004','A1280','點選','2020-04-01 00:00:05')
,('1122334455002','001','C1280','點選','2020-04-02 00:00:04')
,('1122334455003','003','D1280','點選','2020-04-03 00:00:04')
,('1122334455004','005','B1280','點選','2020-04-03 00:00:05')
,('1122334455005','006','D1280','點選','2020-04-04 00:00:05')
,('1122334455006','001','B1280','點選','2020-04-05 00:00:04')
,('1122334455007','001','B1280','下單','2020-04-05 00:00:04')
,('1122334455008','004','C1280','點選','2020-04-05 00:00:05')
,('1122334455009','003','A1280','點選','2020-04-06 00:00:04')
,('1122334455010','001','D1280','點選','2020-04-07 00:00:04')
,('1122334455011','002','C1280','點選','2020-04-08 00:00:04')
,('1122334455012','005','B1280','點選','2020-04-08 00:00:05')
,('1122334455013','002','D1280','點選','2020-04-09 00:00:04')
,('1122334455014','006','B1280','點選','2020-04-09 00:00:05')
,('1122334455015','003','D1280','點選','2020-04-09 00:00:05')
,('1122334455016','002','C1280','點選','2020-04-10 00:00:04')
,('1122334455017','003','A1280','支付','2020-04-11 00:00:04')
,('1122334455018','002','D1280','下單','2020-04-12 00:00:04')
,('1122334455019','003','A1280','下單','2020-04-13 00:00:04')
,('1122334455020','002','C1280','下單','2020-04-14 00:00:04')
,('1122334455021','004','A1280','點選','2020-04-14 00:00:05')
,('1122334455022','005','C1280','點選','2020-04-14 00:00:05')
,('1122334455023','001','A1280','點選','2020-04-15 00:00:04')
,('1122334455024','002','A1280','點選','2020-04-16 00:00:04')
,('1122334455025','003','D1280','點選','2020-04-16 00:00:05')
,('1122334455025','002','C1280','點選','2020-04-17 00:00:04')
,('1122334455027','001','C1280','下單','2020-04-18 00:00:04')
,('1122334455028','003','D1280','點選','2020-04-18 00:00:05')
,('1122334455029','003','D1280','點選','2020-04-19 00:00:05')
,('1122334455030','002','A1280','點選','2020-04-19 00:00:04')
,('1122334455031','002','C1280','支付','2020-04-20 00:00:04')
,('1122334455032','003','D1280','點選','2020-04-02 00:00:05')
,('1122334455033','003','D1280','點選','2020-04-02 00:00:05')
,('1122334455034','002','C1280','點選','2020-05-19 11:00:04');
--------------------------------
--建表
DROP TABLE IF EXISTS `dws_log_info` ;
CREATE TABLE IF NOT EXISTS `dws_log_info`
(
`action_id` STRING COMMENT '動作通路記錄id'
,`user_id` STRING COMMENT '使用者id'
,`user_name` STRING COMMENT '使用者名'
,`city` STRING COMMENT '城市'
,`product_id` STRING COMMENT '商品id'
,`product_name` STRING COMMENT '商品名'
,`model` STRING COMMENT '模式'
,`action` STRING COMMENT '點選|下單|支付'
,`action_time` STRING COMMENT '動作發生時刻'
)
COMMENT '簡化版通路記錄寬表'
PARTITIONED BY
(
pt STRING
)
;
INSERT OVERWRITE TABLE dws_log_info PARTITION(pt='${bizdate}')
SELECT a.action_id
,b.user_id
,b.user_name
,b.city
,c.product_id
,c.product_name
,c.model
,a.action
,a.action_time
FROM (
SELECT action_id
,user_id
,product_id
,action
,action_time
FROM dwd_user_action
WHERE pt = '${bizdate}'
) a
JOIN (
SELECT user_id
,user_name
,city
FROM dwd_user_info_dim
) b
JOIN (
SELECT product_id
,product_name
,model
FROM dwd_product_info_dim
) c
ON a.user_id = b.user_id
AND a.product_id = c.product_id
;
SELECT * FROM dwd_user_info_dim;
SELECT * FROM dwd_product_info_dim;
SELECT * FROM dwd_user_action WHERE pt='${bizdate}';
SELECT * FROM dws_log_info WHERE pt='${bizdate}';
--SELECT * FROM beijing_month_action_user WHERE pt='${bizdate}';
dws_log_info資料預覽
DataWorks百問百答曆史記錄
請點選這裡檢視>>更多DataWorks技術和産品資訊,歡迎加入
【DataWorks釘釘交流群】