本文為您介紹如何將同步至MaxCompute的使用者資訊表ods_user_info_d_odps及訪問日誌資料ods_raw_log_d_odps,通過DataWorks的MaxCompute節點加工得到目標使用者畫像資料,閱讀本文後,您可以瞭解如何通過DataWorks+MaxCompute產品組合來計算和分析已同步的資料,完成數倉簡單資料加工情境。
前提條件
開始本案例前,請首先完成同步資料中的操作。
已通過Data Integration將儲存於MySQL的使用者基本資料
ods_user_info_d同步至MaxCompute的ods_user_info_d_odps表。已通過Data Integration將儲存於OSS的網站訪問日誌
user_log.txt同步至MaxCompute的ods_raw_log_d_odps表。
章節目標
本小節將對同步到MaxCompute上的ods_user_info_d_odps和ods_raw_log_d_odps進行加工處理,並產生基本使用者畫像表。
將同步至MaxCompute的日誌表
ods_raw_log_d_odps將日誌資訊欄位拆分為多個欄位,並產生新的明細日誌表dwd_log_info_di_odps。利用明細日誌表
dwd_log_info_di_odps和使用者表ods_user_info_d_odps的uid欄位進行關聯,產生匯總使用者日誌表dws_user_info_all_di_odps。dws_user_info_all_di_odps表欄位較多,直接應用於資料消費,表資料較多,所以將其進一步加工為ads_user_info_1d_odps表。
進入資料開發
登入DataWorks控制台,切換至目標地區後,單擊左側導覽列的,在下拉框中選擇對應工作空間後單擊進入資料開發。
一、設計工作流程
在同步資料階段,已經成功將資料同步至MaxCompute,接下來的流程的目標是對資料進行進一步加工,以輸出基本使用者畫像資料。
各層級節點以及工作邏輯。
在商務程序畫布中單擊建立節點,建立以下節點,以供加工資料使用。
節點分類
節點類型
節點名稱
(以最終產出表命名)
代碼邏輯
MaxCompute
ODPS SQL
dwd_log_info_di_odps使用內建函數,自訂函數等完成原始日誌
ods_raw_log_d_odps資料拆分寫入dwd_log_info_di_odps表多個欄位。MaxCompute
ODPS SQL
dws_user_info_all_di_odps將使用者基本資料和初步加工後的日誌資料進行匯總,合并為一張表。
MaxCompute
ODPS SQL
ads_user_info_1d_odps進一步加工產出基本使用者畫像。
流程DAG圖。
將節點群組件拖拽至商務程序畫布,並通過拉線設定節點上下遊依賴的方式,設計資料加工階段的商務程序。

二、配置商務程序
建立MaxCompute表
提前建立dwd_log_info_di_odps、dws_user_info_all_di_odps、ads_user_info_1d_odps表,用於存放每層加工後的資料。以下僅快速建立相關表,更多MaxCompute表相關操作,請參見建立並使用MaxCompute表。
進入建立表入口。
在資料開發頁面,開啟同步資料階段建立的商務程序WorkShop。按右鍵MaxCompute,選擇建立表。
定義MaxCompute表結構。
在建立表對話方塊中,輸入表名,單擊建立。此處需要建立三張表,表名分別為
dwd_log_info_di_odps、dws_user_info_all_di_odps、ads_user_info_1d_odps。選擇DDL方式建表,三張表建表命令請參考下文。提交至引擎生效。
表結構定義完成後,分別單擊提交到開發環境和提交到生產環境,系統將根據您的配置在開發環境與生產環境對應計算引擎專案中分別建立目標引擎物理表。
提交表至DataWorks的開發環境,即在開發環境的MaxCompute引擎中建立當前表。
提交表至DataWorks的生產環境,即在生產環境的MaxCompute引擎中建立當前表。
說明若使用簡單模式的工作空間,僅需將表提交至生產環境。簡單模式與標準模式工作空間的介紹,詳情請參見必讀:簡單模式和標準模式的區別。
DataWorks與MaxCompute關係及對應環境的MaxCompute引擎,詳情請參見:DataWorks On MaxCompute使用說明。
建立dwd_log_info_di_odps表
雙擊dwd_log_info_di_odps表,在右側的編輯頁面單擊DDL,輸入下述建表語句。
CREATE TABLE IF NOT EXISTS dwd_log_info_di_odps (
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;建立dws_user_info_all_di_odps表
雙擊dws_user_info_all_di_odps表,在右側的編輯頁面單擊DDL,輸入下述建表語句。
CREATE TABLE IF NOT EXISTS dws_user_info_all_di_odps (
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;建立ads_user_info_1d_odps表
雙擊ads_user_info_1d_odps表,在右側的編輯頁面單擊DDL,輸入下述建表語句。
CREATE TABLE IF NOT EXISTS ads_user_info_1d_odps (
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轉換服務。
上傳資源(ip2region.jar)。
- 說明
ip2region.jar此資源範例僅為教程使用。 在資料開發頁面開啟WorkShop商務程序。按右鍵MaxCompute,選擇。
單擊上傳,選擇已下載至本地的ip2region.jar,單擊開啟。
說明請選中上傳為ODPS資源。
資源名稱無需與上傳的檔案名稱保持一致。
單擊工具列
按鈕,將資源提交至開發環境對應的MaxCompute引擎專案。
註冊函數(getregion)。
進入函數註冊頁。
在資料開發頁面開啟商務程序,按右鍵MaxCompute,選擇建立函數。
填寫函數名稱。
在建立函數對話方塊中,輸入函數名稱
getregion,單擊建立。在註冊函數對話方塊中,配置各項參數。

參數
描述
函數類型
選擇函數類型。
MaxCompute引擎執行個體
預設不可以修改。
函數名
建立函數時輸入的函數名稱。
責任人
選擇責任人。
類名
輸入
org.alidata.odps.udf.Ip2Region。資源清單
輸入
ip2region.jar。描述
輸入IP地址轉換地區。
命令格式
輸入
getregion('ip')。參數說明
輸入IP地址。
單擊
按鈕,將函數提交至開發環境對應的引擎。
配置MaxCompute資料加工節點
本案例需要將每層加工邏輯通過ODPS SQL調度實現,由於各層節點間存在強血緣依賴,並且在資料同步階段已將同步任務產出表手動添加為節點的輸出,所以本案例資料加工類的任務依賴關係通過DataWorks自動解析機制根據血緣自動設定。
配置dwd_log_info_di_odps節點
在商務程序面板,雙擊dwd_log_info_di_odps節點,利用建立的函數處理上遊表ods_raw_log_d_odps欄位的SQL代碼,並將其寫入dwd_log_info_di_odps表中,資料加工展示可參考:附錄:加工樣本。
編輯代碼。
-- 情境:以下SQL使用函數getregion對原始日誌資料中的ip進行解析,並通過正則等方式,將未經處理資料拆解為可分析欄位寫入並寫入dwd_log_info_di_odps表。 -- 本案例已為您準備好用於將IP解析為地區的函數getregion。 -- 補充: -- 1. 在DataWorks節點中使用函數前,您需要先將註冊函數所需資源上傳至DataWorks,再通過可視化方式使用該資源註冊函數。 -- 本案例註冊函數getregion所用的資源為ip2region.jar。 -- 2. DataWorks提供調度參數,可實現調度情境下,將每日增量資料寫入目標表對應業務分區。 -- 在實際開發情境下,您可通過${變數名}格式定義代碼變數,並在調度配置頁面通過為變數賦值調度參數的方式,實現調度情境下代碼動態入參。 INSERT OVERWRITE TABLE dwd_log_info_di_odps 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_odps WHERE dt ='${bizdate}' ) a;配置調度屬性。
配置頁面單擊右側調度配置,可進入調度配置面板配置調度與節點資訊,詳情可參見節點調度配置。以下為配置的內容:
配置項
配置內容
圖示
調度參數
在調度參數配置參數:
參數名:
bizdate。參數值:
$[yyyymmdd-1]。

時間屬性
調度周期:
日。定時調度時間:
00:30。重跑屬性:運行成功或失敗後皆可重跑。
其餘參數保持預設即可。
說明當前節點每日起調時間由商務程序虛擬節點workshop_start的定時調度時間控制,即每日00:30後才會調度。

資源屬性
選擇準備環境階段建立的Serverless資源群組。

調度依賴
通過代碼自動解析自動將產出
ods_raw_log_d_odps表資料的ods_raw_log_d_odps節點設定為當前節點dwd_log_info_di_odps的上遊依賴。將dwd_log_info_di_odps表作為節點輸出,方便下遊查詢該表資料時自動掛上當前節點依賴。
說明依賴的上遊節點:單擊代碼解析輸入輸出按鈕,會根據代碼中的表名解析到上遊節點配置的
MaxCompute生產專案名稱.表名的輸出節點名作為上遊節點輸出名。本節點輸出名稱:單擊代碼解析輸入輸出按鈕,會根據代碼中的表名解析產生本節點產生
MaxCompute生產專案名稱.表名格式的輸出名,輸出給下遊節點。本案例其他必填配置項,您可按需自行配置,配置完成後,在節點代碼編輯頁面,單擊工具列中的
按鈕,儲存當前配置。
配置dws_user_info_all_di_odps節點
在商務程序面板中,雙擊dws_user_info_all_di_odps節點,編寫合并上遊表dwd_log_info_di_odps和ods_user_info_d_odps的SQL代碼,寫入dws_user_info_all_di_odps表中。
編輯代碼。
-- 情境:將加工後的日誌資料dwd_log_info_di_odps與使用者基本資料資料ods_user_info_d_odps匯總寫入dws_user_info_all_di_odps表。 -- 補充:DataWorks提供調度參數,可實現調度情境下,將每日增量資料寫入目標表對應業務分區。 -- 在實際開發情境下,您可通過${變數名}格式定義代碼變數,並在調度配置頁面通過為變數賦值調度參數的方式,實現調度情境下代碼動態入參。 INSERT OVERWRITE TABLE dws_user_info_all_di_odps 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_odps WHERE dt = '${bizdate}' ) a LEFT OUTER JOIN ( SELECT * FROM ods_user_info_d_odps WHERE dt = '${bizdate}' ) b ON a.uid = b.uid;配置調度屬性。
配置頁面單擊右側調度配置,可進入調度配置面板配置調度與節點資訊,詳情可參見節點調度配置。以下為配置的內容:
配置項
配置內容
圖示
調度參數
在調度參數配置參數:
參數名:
bizdate參數值:
$[yyyymmdd-1]

時間屬性
調度周期:
日。定時調度時間:
00:30。重跑屬性:運行成功或失敗後皆可重跑。
其餘參數保持預設即可。
說明當前節點每日起調時間由商務程序虛擬節點workshop_start的定時調度時間控制,即每日00:30後才會調度。

資源屬性
選擇準備環境階段建立的Serverless資源群組。

調度依賴
通過代碼自動解析自動將產出
dwd_log_info_di_odps和ods_user_info_d_odps表資料的節點dwd_log_info_di_odps、ods_user_info_d_odps作為當前節點dws_user_info_all_di_odps的上遊依賴。將節點產出表dws_user_info_all_di_odps作為節點輸出,方便下遊查詢該表資料時自動掛上當前節點依賴。
說明依賴的上遊節點:單擊代碼解析輸入輸出按鈕,會根據代碼中的表名解析到上遊節點配置的
MaxCompute生產專案名稱.表名的輸出節點名作為上遊節點輸出名。本節點輸出名稱:單擊代碼解析輸入輸出按鈕,會根據代碼中的表名解析產生本節點產生
MaxCompute生產專案名稱.表名格式的輸出名,輸出給下遊節點。本案例其他必填配置項,您可按需自行配置,配置完成後,在節點代碼編輯頁面,單擊工具列中的
按鈕,儲存當前配置。
配置ads_user_info_1d_odps節點
在商務程序面板中,雙擊ads_user_info_1d_odps節點,編寫SQL代碼,對上遊的dws_user_info_all_di_odps表進行加工處理,並將結果寫入ads_user_info_1d_odps表中。
編輯代碼。
-- 情境:以下SQL用於對使用者訪問資訊寬表dws_user_info_all_di_odps進一步加工產出基本的使用者畫像資料寫入ads_user_info_1d_odps表。 -- 補充:DataWorks提供調度參數,可實現調度情境下,將每日增量資料寫入目標表對應業務分區。 -- 在實際開發情境下,您可通過${變數名}格式定義代碼變數,並在調度配置頁面通過為變數賦值調度參數的方式,實現調度情境下代碼動態入參。 INSERT OVERWRITE TABLE ads_user_info_1d_odps 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_odps WHERE dt = '${bizdate}' GROUP BY uid;配置調度屬性。
配置頁面單擊右側調度配置,可進入調度配置面板配置調度與節點資訊,詳情可參見節點調度配置。以下為配置的內容:
配置項
配置內容
圖示
調度參數
在調度參數配置參數:
參數名:
bizdate。參數值:
$[yyyymmdd-1]。

時間屬性
調度周期:
日。定時調度時間:
00:30。重跑屬性:運行成功或失敗後皆可重跑。
其餘參數保持預設即可。
說明當前節點每日起調時間由商務程序虛擬節點workshop_start的定時調度時間控制,即每日00:30後才會調度。

資源屬性
選擇準備環境階段建立的Serverless資源群組。

調度依賴
通過代碼自動解析自動根據節點血緣關係配置節點上下遊依賴關係,即將產出
dws_user_info_all_1d_odps表資料的dws_user_info_all_1d_odps節點設定為當前節點ads_user_info_1d_odps的上遊。將節點產出表ads_user_info_1d作為節點輸出,方便下遊查詢該表資料時自動掛上當前節點依賴。
說明依賴的上遊節點:單擊代碼解析輸入輸出按鈕,會根據代碼中的表名解析到上遊節點配置的
MaxCompute生產專案名稱.表名的輸出節點名作為上遊節點輸出名。本節點輸出名稱:單擊代碼解析輸入輸出按鈕,會根據代碼中的表名解析產生本節點產生
MaxCompute生產專案名稱.表名格式的輸出名,輸出給下遊節點。本案例其他必填配置項,您可按需自行配置,配置完成後,在節點代碼編輯頁面,單擊工具列中的
按鈕,儲存當前配置。
三、運行商務程序
運行商務程序
在資料開發頁面,雙擊商務程序下的
使用者Portrait analysis_MaxCompute,開啟Workflow商務程序面板後,單擊工具列中的
表徵圖,按照上下遊依賴關係運行商務程序。
確認執行情況:
查看任務運行狀態:節點處於
狀態,即代表同步執行過程無問題。查看任務執行日誌:按右鍵節點,選擇查看日誌,即可查看開發環境下整個使用者Portrait analysis流程的各個節點日誌。
查看同步結果
待所有任務處於
狀態後,查詢最終加工的結果表。
您可在資料開發頁面的左側導覽列,單擊
,進入臨時查詢面板。按右鍵臨時查詢,選擇建立節點 > ODPS SQL。
在ODPS SQL節點中執行如下SQL語句,確認本案例最終的結果表。
//您需要將分區過濾條件更新為您當前操作的實際業務日期。例如,任務啟動並執行日期為20230222,則業務日期為20230221,即任務運行日期的前一天。 select count(*) from ads_user_info_1d_odps where dt='業務日期';
說明本教程由於在DataStudio(開發環境)執行,所以該資料將預設寫入開發環境對應的引擎專案workshop2024_01_dev的指定表中。
四、發布商務程序
任務需要發布至生產環境後才可自動調度運行,請參見以下內容。
提交至開發環境
在商務程序面板工具列中,單擊
提交按鈕,提交整個商務程序中的任務,請按照圖示配置,並單擊確認。

發布至生產環境
提交商務程序後,表示任務已進入開發環境。由於開發環境的任務不會自動調度,您需要將任務發布至生產環境。
在商務程序面板,單擊工具列中的
表徵圖,或單擊資料開發頁面任務發布按鈕,進入建立發布包頁面。批量發布目標任務,包括該商務程序涉及的資源、函數。
五、營運調度
在實際開發情境下,您可通過在生產環境執行補資料操作實現歷史資料回刷。本教程以補資料為例,為您展示營運調度操作,更多營運能力請參見:營運中心。
進入營運中心。
任務發布成功後,單擊右上方的營運中心。
您也可以進入商務程序的編輯頁面,單擊工具列中的前往營運,進入營運中心頁面。
針對周期任務執行補資料操作。
在左側導覽列,單擊,進入周期任務頁面,單擊起始根節點
workshop_start_odps。按右鍵
workshop_start_odps節點,選擇。選
workshop_start_odps節點的所有下遊節點,輸入業務日期,單擊確定,自動跳轉至補資料頁面。
單擊重新整理,直至SQL任務全部運行成功即可。
後續步驟
在完成任務發布後,整個商務程序已經完成,即可查看已建立表詳情或消費對應資料表,以及對資料配置品質監控,詳情可參見:管理資料、API資料服務、資料視覺效果展現和監控資料品質。
附錄:加工樣本
加工前
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加工後
