RDS遷移至MaxCompute實現(xiàn)動態(tài)分區(qū)
本文為您介紹如何使用DataWorks數(shù)據(jù)集成同步功能自動創(chuàng)建分區(qū),動態(tài)地將RDS中的數(shù)據(jù)遷移至MaxCompute大數(shù)據(jù)計算服務。
前提條件
準備DataWorks環(huán)境
在DataWorks上完成創(chuàng)建業(yè)務流程,本例使用DataWorks簡單模式。詳情請參見創(chuàng)建業(yè)務流程。
新增數(shù)據(jù)源
新增MySQL數(shù)據(jù)源作為數(shù)據(jù)來源,詳情請參見配置MySQL數(shù)據(jù)源。
新增MaxCompute數(shù)據(jù)源作為目標數(shù)據(jù)源接收RDS數(shù)據(jù),詳情請參見配置MaxCompute數(shù)據(jù)源。
自動創(chuàng)建分區(qū)
準備工作完成后,需要將RDS中的數(shù)據(jù)定時每天同步到MaxCompute中,自動創(chuàng)建按天日期的分區(qū)。詳細的數(shù)據(jù)同步任務的操作和配置請參見DataWorks數(shù)據(jù)開發(fā)和運維。
登錄DataWorks控制臺。
在MaxCompute上創(chuàng)建目標表。
在左側導航欄,單擊工作空間列表。
單擊相應工作空間操作列的快速進入 > 數(shù)據(jù)開發(fā)。
右鍵單擊已創(chuàng)建的業(yè)務流程,選擇 。
在新建表頁面,選擇引擎類型并輸入表名。
在表的編輯頁面,單擊DDL模式。
在DDL對話框,輸入如下建表語句,單擊生成表結構。
CREATE TABLE IF NOT EXISTS ods_user_info_d ( uid STRING COMMENT '用戶ID', gender STRING COMMENT '性別', age_range STRING COMMENT '年齡段', zodiac STRING COMMENT '星座' ) PARTITIONED BY ( dt STRING );
單擊提交到生產(chǎn)環(huán)境。
新建離線同步節(jié)點。
進入數(shù)據(jù)開發(fā)頁面,右鍵單擊指定業(yè)務流程,選擇 。
在新建節(jié)點對話框中,輸入節(jié)點名稱,并單擊確認。
選擇數(shù)據(jù)來源和數(shù)據(jù)去向。
配置分區(qū)參數(shù)。
在右側導航欄上,單擊調度配置。
在調度參數(shù)區(qū)域,設置參數(shù)。參數(shù)值默認為系統(tǒng)自帶的時間參數(shù)
${bizdate}
,格式為yyyymmdd。說明默認參數(shù)值與數(shù)據(jù)去向中的分區(qū)信息值對應。調度執(zhí)行遷移任務時,目標表的分區(qū)值會被自動替換為任務執(zhí)行日期的前一天,默認情況下,您會在當前執(zhí)行前一天的業(yè)務數(shù)據(jù),這個日期也叫做業(yè)務日期。如果您需要使用當天任務運行的日期作為分區(qū)值,則需自定義參數(shù)值。
自定義參數(shù)設置:用戶可以自主選擇某一天和格式配置,如下所示:
后N年:
$[add_months(yyyymmdd,12*N)]
前N年:
$[add_months(yyyymmdd,-12*N)]
前N月:
$[add_months(yyyymmdd,-N)]
后N周:
$[yyyymmdd+7*N]
后N月:
$[add_months(yyyymmdd,N)]
前N周:
$[yyyymmdd-7*N]
后N天:
$[yyyymmdd+N]
前N天:
$[yyyymmdd-N]
后N小時:
$[hh24miss+N/24]
前N小時:
$[hh24miss-N/24]
后N分鐘:
$[hh24miss+N/24/60]
前N分鐘:
$[hh24miss-N/24/60]
說明使用中括號([])編輯自定義變量參數(shù)的取值計算公式,例如
key1=$[yyyy-mm-dd]
。默認情況下,自定義變量參數(shù)的計算單位為天。例如
$[hh24miss-N/24/60]
表示(yyyymmddhh24miss-(N/24/60 * 1天))
的計算結果,然后按 hh24miss 的格式取時分秒。使用add_months的計算單位為月。例如
$[add_months(yyyymmdd,12 N)-M/24/60]
表示(yyyymmddhh24miss-(12 * N * 1月))-(M/24/60 * 1天)
的結果,然后按yyyymmdd
的格式取年月日。
詳細的參數(shù)設置請參見調度參數(shù)支持的格式。
單擊圖標運行代碼。
您可以在運行日志查看運行結果。
補數(shù)據(jù)實驗
如果您的數(shù)據(jù)中存在大量運行日期之前的歷史數(shù)據(jù),需要實現(xiàn)自動同步和自動分區(qū)。您可以通過DataWorks的運維中心,選擇當前的同步數(shù)據(jù)節(jié)點,使用補數(shù)據(jù)功能實現(xiàn)。
在RDS端按照日期篩選出歷史數(shù)據(jù)。
您可以在同步節(jié)點數(shù)據(jù)來源區(qū)域設置數(shù)據(jù)過濾條件。
執(zhí)行補數(shù)據(jù)操作。詳情請參見執(zhí)行補數(shù)據(jù)并查看補數(shù)據(jù)實例(新版)。
在運行的日志中查看對RDS數(shù)據(jù)的抽取結果。
從運行結果中可以看到MaxCompute已自動創(chuàng)建分區(qū)。
運行結果驗證。在MaxCompute客戶端執(zhí)行如下命令,查看數(shù)據(jù)寫入情況。
SELECT count(*) from ods_user_info_d where dt = 20180913;
Hash實現(xiàn)非日期字段分區(qū)
如果您的數(shù)據(jù)量較大,或沒有按照日期字段對第一次全量的數(shù)據(jù)進行分區(qū),而是按照省份等非日期字段分區(qū),則此時數(shù)據(jù)集成操作將不能實現(xiàn)自動分區(qū)。這種情況下,您可以按照RDS中某個字段進行Hash,將相同的字段值自動存放到這個字段對應值的MaxCompute分區(qū)中。
將數(shù)據(jù)全量同步到MaxCompute的一個臨時表,創(chuàng)建一個SQL腳本節(jié)點。執(zhí)行如下命令。
drop table if exists ods_user_t; CREATE TABLE ods_user_t ( dt STRING, uid STRING, gender STRING, age_range STRING, zodiac STRING); --將MaxCompute表中的數(shù)據(jù)存入臨時表。 insert overwrite table ods_user_t select dt,uid,gender,age_range,zodiac from ods_user_info_d;
創(chuàng)建同步任務的節(jié)點mysql_to_odps,即簡單的同步任務。將RDS數(shù)據(jù)全量同步到MaxCompute,無需設置分區(qū)。
使用SQL語句進行動態(tài)分區(qū)到目標表,命令如下。
drop table if exists ods_user_d; //創(chuàng)建一個ODPS分區(qū)表(最終目的表)。 CREATE TABLE ods_user_d ( uid STRING, gender STRING, age_range STRING, zodiac STRING ) PARTITIONED BY ( dt STRING ); //執(zhí)行動態(tài)分區(qū)SQL,按照臨時表的字段dt自動分區(qū),dt字段中相同的數(shù)據(jù)值,會按照這個數(shù)據(jù)值自動創(chuàng)建一個分區(qū)值。 //例如dt中有些數(shù)據(jù)是20181025,會自動在ODPS分區(qū)表中創(chuàng)建一個分區(qū),dt=20181025。 //動態(tài)分區(qū)SQL如下。 //可以注意到SQL中select的字段多寫了一個dt,就是指定按照這個字段自動創(chuàng)建分區(qū)。 insert overwrite table ods_user_d partition(dt)select dt,uid,gender,age_range,zodiac from ods_user_t; //導入完成后,可以把臨時表刪除,節(jié)約存儲成本。 drop table if exists ods_user_t;
在MaxCompute中您可以通過SQL語句完成數(shù)據(jù)同步。
將三個節(jié)點配置成一個工作流,按順序執(zhí)行。
查看執(zhí)行過程。您可以重點觀察最后一個節(jié)點的動態(tài)分區(qū)過程。
運行結果驗證。在MaxCompute客戶端執(zhí)行如下命令,查看數(shù)據(jù)寫入情況。
SELECT count(*) from ods_user_d where dt = 20180913;