本文為您介紹如何將同步至MaxCompute的使用者資訊表ods_user_info_d及訪問日誌資料ods_raw_log_d,通過DataWorks的ODPS SQL節點加工得到目標使用者畫像資料,閱讀本文後您可瞭解到如何通過DataWorks+MaxCompute產品組合來計算和分析已同步的資料,完成數倉簡單資料加工情境。
前提條件
開始本實驗前,請首先完成同步資料中的操作。
已通過Data Integration將儲存於MySQL的使用者基本資料(ods_user_info_d)同步至MaxCompute的ods_user_info_d表。
已通過Data Integration將儲存於OSS的網站訪問日誌(user_log.txt)同步至MaxCompute的ods_raw_log_d表。
快速體驗
本案例中,資料同步和資料加工的部分任務可以通過ETL工作流程範本一鍵匯入。在匯入模板後,您可以前往目標空間,並自行完成後續的資料品質監控和資料視覺效果操作。
僅空間管理員角色可匯入ETL模板至目標工作空間,為帳號授權空間管理員角色詳情請參見空間級模組許可權管控。
匯入ETL工作流程範本,詳情請參見ETL工作流程快速體驗。
ETL工作流程範本快捷入口,請點擊網站使用者行為分析。
背景資訊
資料開發DataStudio提供豐富的節點,並對引擎能力進行封裝,本案例使用ODPS SQL節點對同步至MaxCompute的使用者資料與訪問日誌資料進行分層加工,具體邏輯請參照下文。
商務程序管控:
使用虛擬節點統籌管理整個商務程序,例如整個使用者行為分析畫像商務程序調起時間、是否運行等。本案例設定加工任務為日調度任務,並通過指定workshop_start節點實現整個工作流程每日00:15開始調度。
增量資料加工:
使用調度參數,通過分區名+動態參數的方式,實現調度情境下,每日將增量資料寫入目標表對應時間分區。
資料加工過程:
使用可視化方式上傳資源並註冊自訂函數getregion,將系統日誌資料中的IP資訊轉換為地區資訊。
依賴關係設定:
使用自動解析機制,根據節點代碼血緣自動化佈建節點依賴關係,保障下遊取數無誤。
重要建議實際開發時嚴格遵守以下節點開發規範更有利於調度依賴自動解析,避免非預期報錯產生。更多關於調度依賴的原理,請參見調度依賴配置指引。
節點和產出表一對一關聯性。
節點名命名與產出表名保持一致。
進入資料開發
登入DataWorks控制台,切換至目標地區後,單擊左側導覽列的 ,在下拉框中選擇對應工作空間後單擊進入資料開發。
步驟一:建立MaxCompute表
提前建立dwd_log_info_di、dws_user_info_all_di、ads_user_info_1d表,用於存放每層加工後的資料。以下僅快速建立相關表,更多MaxCompute表相關操作,請參見建立並使用MaxCompute表。
進入建立表入口。
在資料開發頁面,開啟資料同步階段建立的商務程序WorkShop。按右鍵MaxCompute,選擇建立表。
定義MaxCompute表結構。
在建立表對話方塊中,輸入表名,單擊建立。此處需要建立三張表,表名分別為dwd_log_info_di、dws_user_info_all_di、ads_user_info_1d。選擇DDL方式建表,三張表建表命令請參考下文。
提交至引擎生效。
表結構定義完成後,分別單擊提交到開發環境和提交到生產環境,系統將根據您的配置在開發環境與生產環境對應計算引擎專案分別建立目標引擎物理表。
提交表至DataWorks的開發環境,即在開發環境的MaxCompute引擎中建立當前表。
提交表至DataWorks的生產環境,即在生產環境的MaxCompute引擎中建立當前表。
說明若使用簡單模式的工作空間,僅需將表提交至生產環境。簡單模式與標準模式工作空間的介紹,詳情請參見必讀:簡單模式和標準模式的區別。
DataWorks與MaxCompute關係及對應環境的MaxCompute引擎,詳情請參見:DataWorks On MaxCompute使用說明。
1、建立dwd_log_info_di表
雙擊dwd_log_info_di表,在右側的編輯頁面單擊DDL,輸入下述建表語句。
CREATE TABLE IF NOT EXISTS dwd_log_info_di (
ip STRING COMMENT 'ip地址',
uid STRING COMMENT '使用者ID',
time STRING COMMENT '時間yyyymmddhh:mi:ss',
status STRING COMMENT '伺服器返回狀態代碼',
bytes STRING COMMENT '返回給用戶端的位元組數',
region STRING COMMENT '地區,根據ip得到',
method STRING COMMENT 'http請求類型',
url STRING COMMENT 'url',
protocol STRING COMMENT 'http協議版本號碼',
referer STRING COMMENT '來源url',
device STRING COMMENT '終端類型 ',
identity STRING COMMENT '訪問類型 crawler feed user unknown'
)
PARTITIONED BY (
dt STRING
)
LIFECYCLE 14;
2、建立dws_user_info_all_di表
雙擊dws_user_info_all_di表,在右側的編輯頁面單擊DDL,輸入下述建表語句。
CREATE TABLE IF NOT EXISTS dws_user_info_all_di (
uid STRING COMMENT '使用者ID',
gender STRING COMMENT '性別',
age_range STRING COMMENT '年齡段',
zodiac STRING COMMENT '星座',
region STRING COMMENT '地區,根據ip得到',
device STRING COMMENT '終端類型 ',
identity STRING COMMENT '訪問類型 crawler feed user unknown',
method STRING COMMENT 'http請求類型',
url STRING COMMENT 'url',
referer STRING COMMENT '來源url',
time STRING COMMENT '時間yyyymmddhh:mi:ss'
)
PARTITIONED BY (
dt STRING
)
LIFECYCLE 14;
3、建立ads_user_info_1d表
雙擊ads_user_info_1d表,在右側的編輯頁面單擊DDL,輸入下述建表語句。
CREATE TABLE IF NOT EXISTS ads_user_info_1d (
uid STRING COMMENT '使用者ID',
region STRING COMMENT '地區,根據ip得到',
device STRING COMMENT '終端類型 ',
pv BIGINT COMMENT 'pv',
gender STRING COMMENT '性別',
age_range STRING COMMENT '年齡段',
zodiac STRING COMMENT '星座'
)
PARTITIONED BY (
dt STRING
)
LIFECYCLE 14;
步驟二:建立函數(getregion)
根據同步的原始日誌資料格式,我們需要通過函數等方式將其拆解為目標格式。本案例已為您提供用於將IP解析為地區的函數所需資源,您僅需將其下載至本地,並在DataWorks註冊函數前,將函數涉及的資源上傳至DataWorks空間即可。
該函數僅為本教程使用(IP資源範例),若需在正式業務中實現IP到地理位置的映射功能,需前往專業IP網站擷取相關IP轉換服務。
1、上傳資源(ip2region.jar)
- 說明
ip2region.jar
此資源範例僅為教程使用。 在資料開發頁面開啟WorkShop商務程序。按右鍵MaxCompute,選擇
。單擊上傳,選擇已下載至本地的ip2region.jar,單擊開啟。
說明請選中上傳為ODPS資源。
資源名稱無需與上傳的檔案名稱保持一致。
單擊工具列按鈕,將資源提交至開發環境對應的MaxCompute引擎專案。
2、註冊函數(getregion)
進入函數註冊頁。
在資料開發頁面開啟商務程序,按右鍵MaxCompute,選擇建立函數。
填寫函數名稱。
在建立函數對話方塊中,輸入函數名稱(getregion),單擊建立。
在註冊函數對話方塊中,配置各項參數。
參數
描述
函數類型
選擇函數類型。
MaxCompute引擎執行個體
預設不可以修改。
函數名
建立函數時輸入的函數名稱。
責任人
選擇責任人。
類名
輸入org.alidata.odps.udf.Ip2Region。
資源清單
輸入ip2region.jar。
描述
輸入IP地址轉換地區。
命令格式
輸入getregion('ip')。
參數說明
輸入IP地址。
提交函數。
單擊按鈕,將函數提交至開發環境對應的引擎。
步驟三:配置ODPS SQL節點
本案例需要將每層加工邏輯通過ODPS SQL調度實現,由於各層節點間存在強血緣依賴,並且在資料同步階段已將同步任務產出表手動添加為節點的輸出,所以本案例資料加工類的任務依賴關係通過DataWorks自動解析機制根據血緣自動設定。
請按照順序依次建立,否則將可能產生非預期報錯。
開啟商務程序。
在資料開發頁面,雙擊同步資料階段建立的商務程序名,本案例商務程序名為WorkShop。
建立節點。
在該商務程序下,按右鍵MaxCompute,選擇建立節點 >ODPS SQL。本案例需要依次建立如下三個節點:dwd_log_info_di、dws_user_info_all_di、ads_user_info_1d,具體配置如下。
1、配置dwd_log_info_di節點
使用步驟二建立的getregion函數對ods_raw_log_d表中的IP資訊進行解析,並使用正則等方式,拆解為可分析欄位寫入dwd_log_info_di表,dwd加工前後資料比對,可參見附錄:加工樣本。
1. 編輯代碼
在商務程序面板中,雙擊開啟dwd_log_info_di節點,並配置如下代碼,DataWorks通過${變數名}格式定義代碼變數。其中代碼中的${bizdate}為代碼變數,該變數將在後續步驟2中為其賦值。
-- 情境:以下SQL使用函數getregion對原始日誌資料中的ip進行解析,並通過正則等方式,將未經處理資料拆解為可分析欄位寫入並寫入dwd_log_info_di表。
-- 本案例已為您準備好用於將IP解析為地區的函數getregion。
-- 補充:
-- 1. 在DataWorks節點中使用函數前,您需要先將註冊函數所需資源上傳至DataWorks,再通過可視化方式使用該資源註冊函數,詳見:https://www.alibabacloud.com/help/zh/dataworks/user-guide/create-and-use-maxcompute-resources
-- 本案例註冊函數getregion所用的資源為ip2region.jar。
-- 2. DataWorks提供調度參數,可實現調度情境下,將每日增量資料寫入目標表對應業務分區。
-- 在實際開發情境下,您可通過${變數名}格式定義代碼變數,並在調度配置頁面通過為變數賦值調度參數的方式,實現調度情境下代碼動態入參。
INSERT OVERWRITE TABLE dwd_log_info_di PARTITION (dt='${bizdate}')
SELECT ip
, uid
, time
, status
, bytes
, getregion(ip) AS region --使用自訂UDF通過IP得到地區。
, regexp_substr(request, '(^[^ ]+ )') AS method --通過正則把request差分為3個欄位。
, regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') AS url
, regexp_substr(request, '([^ ]+$)') AS protocol
, regexp_extract(referer, '^[^/]+://([^/]+){1}') AS referer --通過正則清晰refer,得到更精準的URL。
, CASE
WHEN TOLOWER(agent) RLIKE 'android' THEN 'android' --通過agent得到終端資訊和訪問形式。
WHEN TOLOWER(agent) RLIKE 'iphone' THEN 'iphone'
WHEN TOLOWER(agent) RLIKE 'ipad' THEN 'ipad'
WHEN TOLOWER(agent) RLIKE 'macintosh' THEN 'macintosh'
WHEN TOLOWER(agent) RLIKE 'windows phone' THEN 'windows_phone'
WHEN TOLOWER(agent) RLIKE 'windows' THEN 'windows_pc'
ELSE 'unknown'
END AS device
, CASE
WHEN TOLOWER(agent) RLIKE '(bot|spider|crawler|slurp)' THEN 'crawler'
WHEN TOLOWER(agent) RLIKE 'feed'
OR regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') RLIKE 'feed' THEN 'feed'
WHEN TOLOWER(agent) NOT RLIKE '(bot|spider|crawler|feed|slurp)'
AND agent RLIKE '^[Mozilla|Opera]'
AND regexp_extract(request, '^[^ ]+ (.*) [^ ]+$') NOT RLIKE 'feed' THEN 'user'
ELSE 'unknown'
END AS identity
FROM (
SELECT SPLIT(col, '##@@')[0] AS ip
, SPLIT(col, '##@@')[1] AS uid
, SPLIT(col, '##@@')[2] AS time
, SPLIT(col, '##@@')[3] AS request
, SPLIT(col, '##@@')[4] AS status
, SPLIT(col, '##@@')[5] AS bytes
, SPLIT(col, '##@@')[6] AS referer
, SPLIT(col, '##@@')[7] AS agent
FROM ods_raw_log_d
WHERE dt ='${bizdate}'
) a;
2. 配置調度屬性
通過以下配置實現調度情境下,每日00:15待上遊ods_raw_log_d節點將儲存於OSS的user_log.txt資料同步至MaxCompute的ods_raw_log_d表後,可觸發當前dwd_log_info_di節點對ods_raw_log_d表資料進行加工,加工結果寫入dwd_log_info_di表對應業務時間分區。
配置調度參數:為代碼中的變數bizdate賦值$[yyyymmdd-1],擷取前一天的日期。
配置定時調度時間:配置調度周期為日,無需單獨配置當前節點定時調度時間,當前節點每日調起時間由商務程序根節點WorkShop的定時調度時間控制,即每日00:15後才會調度。
配置依賴關係:通過代碼自動解析自動將產出ods_raw_log_d表資料的ods_raw_log_d節點設定為當前節點dwd_log_info_di的上遊依賴。將dwd_log_info_di表作為節點輸出,方便下遊查詢該表資料時自動掛上當前節點依賴。
說明DataWorks節點輸出是其他節點與當前節點建立依賴關係的媒介。DataWorks通過將上遊節點的節點輸出作為下遊節點的節點輸入,形成節點間的依賴關係。
系統會為每個節點自動產生兩個輸出名,格式分別為:projectName.randomNumber_out、projectName.nodeName_out。
如果使用自動解析功能,系統將根據代碼解析結果為節點產生輸出名,格式為:projectName.tableName。
3. 儲存配置
本案例其他必填配置項,您可按需自行配置,配置完成後,在節點代碼編輯頁面,單擊工具列中的按鈕,儲存當前配置。
2、配置dws_user_info_all_di節點
對同步到MaxCompute的使用者基本資料資料ods_user_info_d和初步加工後的日誌資料dwd_log_info_di進行匯總,產出使用者訪問資訊匯總表dws_user_info_all_di。
1. 編輯代碼
在商務程序面板中,雙擊開啟dws_user_info_all_di節點,並配置如下代碼,DataWorks通過${變數名}格式定義代碼變數。其中代碼中的${bizdate}為代碼變數,該變數將在後續步驟2中為其賦值。
-- 情境:將加工後的日誌資料dwd_log_info_di與使用者基本資料資料ods_user_info_d匯總寫入dws_user_info_all_di表。
-- 補充:DataWorks提供調度參數,可實現調度情境下,將每日增量資料寫入目標表對應業務分區。
-- 在實際開發情境下,您可通過${變數名}格式定義代碼變數,並在調度配置頁面通過為變數賦值調度參數的方式,實現調度情境下代碼動態入參。
INSERT OVERWRITE TABLE dws_user_info_all_di PARTITION (dt='${bizdate}')
SELECT COALESCE(a.uid, b.uid) AS uid
, b.gender
, b.age_range
, b.zodiac
, a.region
, a.device
, a.identity
, a.method
, a.url
, a.referer
, a.time
FROM (
SELECT *
FROM dwd_log_info_di
WHERE dt = '${bizdate}'
) a
LEFT OUTER JOIN (
SELECT *
FROM ods_user_info_d
WHERE dt = '${bizdate}'
) b
ON a.uid = b.uid;
2. 配置調度屬性
通過以下配置實現調度情境下,每日00:15待上遊MySQL使用者基本資料通過Data Integration同步至MaxCompute的ods_user_info_d表,以及dwd_log_info_di節點對ods_raw_log_d表加工完成後,將其匯總寫入dws_user_info_all_di表對應業務分區。
配置調度參數:為代碼中的變數bizdate賦值$[yyyymmdd-1],擷取前一天的日期。
配置定時調度時間:配置調度周期為日,無需單獨配置當前節點定時調度時間,當前節點每日起調時間由商務程序根節點WorkShop的定時調度時間控制,即每日00:15分後才會調度。
配置依賴關係:通過代碼自動解析自動將產出dwd_log_info_di和ods_user_info_d表資料的節點dwd_log_info_di、ods_user_info_d作為當前節點dws_user_info_all_di的上遊依賴。將節點產出表dws_user_info_all_di作為節點輸出,方便下遊查詢該表資料時自動掛上當前節點依賴。
3. 儲存配置
本案例其他必填配置項,您可按需自行配置,配置完成後,在節點代碼編輯頁面,單擊工具列中的按鈕,儲存當前配置。
3、配置ads_user_info_1d節點
對使用者訪問資訊匯總表dws_user_info_all_di進一步加工產出基本的使用者畫像資料ads_user_info_1d。
1. 編輯代碼
在商務程序面板中,雙擊開啟ads_user_info_1d節點,並配置如下代碼,DataWorks通過${變數名}格式定義代碼變數。其中代碼中的${bizdate}為代碼變數,該變數將在後續步驟2中為其賦值。
-- 情境:以下SQL用於對使用者訪問資訊寬表dws_user_info_all_di進一步加工產出基本的使用者畫像資料寫入ads_user_info_1d表。
-- 補充:DataWorks提供調度參數,可實現調度情境下,將每日增量資料寫入目標表對應業務分區。
-- 在實際開發情境下,您可通過${變數名}格式定義代碼變數,並在調度配置頁面通過為變數賦值調度參數的方式,實現調度情境下代碼動態入參。
INSERT OVERWRITE TABLE ads_user_info_1d PARTITION (dt='${bizdate}')
SELECT uid
, MAX(region)
, MAX(device)
, COUNT(0) AS pv
, MAX(gender)
, MAX(age_range)
, MAX(zodiac)
FROM dws_user_info_all_di
WHERE dt = '${bizdate}'
GROUP BY uid;
2. 配置調度屬性
為實現周期調度,我們需要定義任務周期調度的相關屬性。
配置調度參數:為代碼中的變數bizdate賦值$[yyyymmdd-1],擷取前一天的日期。
配置定時調度時間:無需單獨配置當前節點定時調度時間,當前節點每日起調時間由商務程序根節點WorkShop的定時調度時間控制,即每日00:15分後才會調度。
配置依賴關係:通過代碼自動解析自動根據節點血緣關係配置節點上下遊依賴關係,即將產出dws_user_info_all_1d表資料的dws_user_info_all_1d節點設定為當前節點ads_user_info_1d的上遊。將節點產出表ads_user_info_1d作為節點輸出,方便下遊查詢該表資料時自動掛上當前節點依賴。
3. 儲存配置
本案例其他必填配置項,您可按需自行配置,配置完成後,在節點代碼編輯頁面,單擊工具列中的按鈕,儲存當前配置。
步驟四:運行商務程序
發布任務至生產環境前,您可以運行整個商務程序,對代碼進行測試,確保其正確性。
運行商務程序
在商務程序(WorkShop)的編輯頁面,您需要確認最終通過自動解析設定的依賴關係是否與下圖一致。確認依賴關係無誤後,單擊工具列的表徵圖,運行整個任務。
查看運行結果
待所有任務處於狀態後,查詢最終加工的結果表。
您可在資料開發頁面的左側導覽列,單擊,進入臨時查詢面板。
按右鍵臨時查詢,選擇建立節點 > ODPS SQL。
在ODPS SQL節點中執行如下SQL語句,確認本案例最終的結果表。
//您需要將分區過濾條件更新為您當前操作的實際業務日期。例如,任務啟動並執行日期為20230222,則業務日期為20230221,即任務運行日期的前一天。 select count(*) from ads_user_info_1d where dt='業務日期';
步驟五:提交並發布商務程序
任務需要發布至生產環境後才可自動調度運行,請參見以下內容。
提交至開發環境
在商務程序面板工具列中,單擊按鈕,提交整個商務程序中的任務,請按照圖示配置,並單擊確認。
發布至生產環境
提交商務程序後,表示任務已進入開發環境。由於開發環境的任務不會自動調度,您需要發布任務至生產環境。
在商務程序面板,單擊工具列中的表徵圖,或單擊資料開發頁面任務發布按鈕,進入建立發布包頁面。
批量發布目標任務,包括該商務程序涉及的資源、函數。
步驟六:在生產環境執行任務
在實際開發情境下,您可通過在生產環境執行補資料操作實現歷史資料回刷,具體操作如下。
進入營運中心。
任務發布成功後,單擊右上方的營運中心。
您也可以進入商務程序的編輯頁面,單擊工具列中的前往營運,進入營運中心頁面。
針對周期任務執行補資料操作。
在左側導覽列,單擊
,進入周期任務頁面,單擊workshop商務程序的起始根節點workshop_start。按右鍵workshop_start節點,選擇
。選中workshop_start節點的所有下遊節點,輸入業務日期,單擊確定,自動跳轉至補資料執行個體頁面。
單擊重新整理,直至SQL任務全部運行成功即可。
後續步驟
任務周期性調度情境下,為保障任務產出的表資料符合預期,我們可以對任務產出的表資料進行資料品質監控,詳情請參見配置資料品質監控。
附錄:加工樣本
加工前
58.246.10.82##@@2d24d94f14784##@@2014-02-12 13:12:25##@@GET /wp-content/themes/inove/img/feeds.gif HTTP/1.1##@@200##@@2572##@@http://coolshell.cn/articles/10975.html##@@Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36
加工後