全部產品
Search
文件中心

Hologres:通過DataWorks周期性匯入MaxCompute資料最佳實務

更新時間:Jun 30, 2024

DataWorks調度任務,可以按照需求設定資料轉送的時間和頻率,並確保資料在傳輸和匯入處理程序中的完整性和準確性。將MaxCompute分區表資料通過DataWorks匯入Hologres分區表,實現兩個平台的優勢相互結合,從而提高資料處理效率和可靠性。

前提條件

注意事項

請確保MaxCompute租戶層級或專案層級未開通Schema服務。關於Schema詳細介紹,請參見Schema操作

操作步驟

  1. MaxCompute資料準備。

    1. 登入MaxCompute控制台

    2. 單擊左側導覽列資料分析

    3. 資料分析頁面,單擊SQL查詢

      sql查詢

    4. SQL查詢頁面,輸入SQL語句建立分區表,單擊運行

      本文以MaxCompute公用資料集public_data中的分區表dwd_ product_movie_basic_info為例。dwd_ product_movie_basic_info表結構樣本如下。

      --MaxCompute分區表DDL
      CREATE TABLE IF NOT EXISTS public_data.dwd_product_movie_basic_info(
        movie_name STRING COMMENT '電影名稱',
        director STRING COMMENT '導演',
        scriptwriter STRING COMMENT '編劇',
        area STRING COMMENT '製片地區/國家',
        actors STRING COMMENT '主演',
        `type` STRING COMMENT '類型',
        movie_length STRING COMMENT '電影長度',
        movie_date STRING COMMENT '上映日期',
        movie_language STRING COMMENT '語言',
        imdb_url STRING COMMENT 'imdb號'
      ) 
      PARTITIONED BY (ds STRING) STORED AS ALIORC;
    5. SQL查詢頁面,輸入如下SQL語句用於查看分區表中的資料,單擊運行

      資料準備查看分區表20170112分區的資料。

      SELECT * FROM public_data.dwd_product_movie_basic_info WHERE ds = '20170112';
  2. Hologres中建立外部表格。

    建立一張Hologres外部表格,用於映射MaxCompute源頭表資料。外表的欄位順序和欄位類型需要和MaxCompute表的一一對應。

    1. 登入Hologres管理主控台,進入HoloWeb開發頁面建立SQL查詢,詳情請參見建立SQL查詢

    2. 在新增的臨時Query查詢頁面,選擇已建立的執行個體名資料庫後,請您在SQL查詢的編輯框輸入如下語句,單擊運行

      如下語句使用import foreign schema命令,建立名稱為dwd_product_movie_basic_info的Hologres外部表格。

      import foreign schema public_data limit to (dwd_product_movie_basic_info) from server odps_server into public options(if_table_exist 'update');
  3. Hologres中建立真實儲存表(內部表)。

    在Hologres中建立一張內部表,用於接收並儲存資料。

    1. HoloWeb開發頁面,單擊新增SQL視窗

    2. 在新增的臨時Query查詢頁面,選擇已建立的執行個體名資料庫後,請您在SQL查詢的編輯框輸入如下語句,單擊運行

      本次樣本是將MaxCompute分區表匯入Hologres,因此需要在Hologres中建立的內部表為分區表。

      說明

      如下建表語句僅是簡單樣本,實際建表DDL請根據即時業務需要建立,並給表設定合理的索引,以達到更優的查詢效能。

      BEGIN;
      CREATE TABLE "public"."holo_dwd_product_movie_basic_info" (
       "movie_name" text,
       "director" text,
       "scriptwriter" text,
       "area" text,
       "actors" text,
       "type" text,
       "movie_length" text,
       "movie_date" text,
       "movie_language" text,
       "imdb_url" text,
       "ds" text
      )
      PARTITION BY LIST (ds);
      CALL SET_TABLE_PROPERTY('"public"."holo_dwd_product_movie_basic_info"', 'orientation', 'column');
      comment on column "public"."holo_dwd_product_movie_basic_info"."movie_name" is '電影名稱';
      comment on column "public"."holo_dwd_product_movie_basic_info"."director" is '導演';
      comment on column "public"."holo_dwd_product_movie_basic_info"."scriptwriter" is '編劇';
      comment on column "public"."holo_dwd_product_movie_basic_info"."area" is '製片地區/國家';
      comment on column "public"."holo_dwd_product_movie_basic_info"."actors" is '主演';
      comment on column "public"."holo_dwd_product_movie_basic_info"."type" is '類型';
      comment on column "public"."holo_dwd_product_movie_basic_info"."movie_length" is '電影長度';
      comment on column "public"."holo_dwd_product_movie_basic_info"."movie_date" is '上映日期';
      comment on column "public"."holo_dwd_product_movie_basic_info"."movie_language" is '語言';
      comment on column "public"."holo_dwd_product_movie_basic_info"."imdb_url" is 'imdb號';
      COMMIT;
  4. 建立分區子表資料開發。

    此步驟是一個Hologres SQL模組,用於分區表跑調度。

    1. 登入DataWorks控制台,進入資料開發頁面,建立Hologres SQL節點,詳情請參見Hologres SQL節點

    2. 在節點的編輯頁面,輸入如下語句。

      在Hologres中不支援直接將分區資料直接寫入分區父表,因此需要在Hologres中建立對應MaxCompute分區表中分區索引值的分區子表,然後將分區資料匯入對應的分區子表。分區索引值由參數${bizdate}控制,在調度系統中自動賦值完成周期性調度,調度參數的更多內容,請參見調度參數支援的格式

      說明

      匯入的分區資料必須和分區索引值(本文樣本使用的是ds)保持一致,否則會出現報錯。

      匯入分區資料的邏輯情境比較多,下面有兩個情境供參考,請您根據實際商務邏輯兩者選其中一個。

      • 情境一:匯入新的分區資料。

        --建立臨時分區子表
        BEGIN;
        CREATE TABLE IF NOT EXISTS "public".tmp_holo_dwd_product_movie_basic_info_${bizdate}  (
         "movie_name" text,
         "director" text,
         "scriptwriter" text,
         "area" text,
         "actors" text,
         "type" text,
         "movie_length" text,
         "movie_date" text,
         "movie_language" text,
         "imdb_url" text,
         "ds" text
        );
        COMMIT;
        
        --更新外表資料
        import foreign schema public_data limit to (dwd_product_movie_basic_info) from server odps_server into public options(if_table_exist 'update');
        
        --等待30s再匯入Hologres,以防Hologres meta資訊更新緩衝慢導致的資料不一致而同步不成功
        select pg_sleep(30); 
        
        --將MaxCompute資料匯入臨時分區子表
        INSERT INTO "public".tmp_holo_dwd_product_movie_basic_info_${bizdate} 
        SELECT 
            "movie_name",
            "director",
            "scriptwriter",
            "area",
            "actors",
            "type",
            "movie_length",
            "movie_date",
            "movie_language",
            "imdb_url",
            "ds"
        FROM "public".dwd_product_movie_basic_info
        WHERE ds='${bizdate}';
        
        --匯入新的分區資料
        BEGIN;
        
        ALTER TABLE tmp_holo_dwd_product_movie_basic_info_${bizdate} RENAME TO holo_dwd_product_movie_basic_info_${bizdate};
        
        --將臨時分區子表綁定在分區父表上
        ALTER TABLE holo_dwd_product_movie_basic_info ATTACH PARTITION holo_dwd_product_movie_basic_info_${bizdate} FOR VALUES in ('${bizdate}');
        
        COMMIT;
                                            
      • 情境二:重新對歷史分區資料重新整理。

        --建立臨時分區子表
        BEGIN;
        CREATE TABLE IF NOT EXISTS "public".tmp_holo_dwd_product_movie_basic_info_${bizdate}  (
         "movie_name" text,
         "director" text,
         "scriptwriter" text,
         "area" text,
         "actors" text,
         "type" text,
         "movie_length" text,
         "movie_date" text,
         "movie_language" text,
         "imdb_url" text,
         "ds" text
        );
        COMMIT;
        
        --更新外表資料
        import foreign schema public_data limit to (dwd_product_movie_basic_info) from server odps_server into public options(if_table_exist 'update');
        
        --等待30s再匯入Hologres,以防Hologres meta資訊更新緩衝慢導致的資料不一致而同步不成功
        select pg_sleep(30); 
        
        --將MaxCompute資料匯入臨時分區子表
        INSERT INTO "public".tmp_holo_dwd_product_movie_basic_info_${bizdate} 
        SELECT 
            "movie_name",
            "director",
            "scriptwriter",
            "area",
            "actors",
            "type",
            "movie_length",
            "movie_date",
            "movie_language",
            "imdb_url",
            "ds"
        FROM "public".dwd_product_movie_basic_info
        WHERE ds='${bizdate}';
        
        重新對歷史分區資料重新整理
        BEGIN;
        
        ALTER TABLE IF EXISTS holo_dwd_product_movie_basic_info DETACH PARTITION holo_dwd_product_movie_basic_info_${bizdate};
        
        DROP TABLE IF EXISTS holo_dwd_product_movie_basic_info_${bizdate};
        
        ALTER TABLE tmp_holo_dwd_product_movie_basic_info_${bizdate} RENAME TO holo_dwd_product_movie_basic_info_${bizdate};
        
        --將分區子表綁定在分區父表上
        ALTER TABLE holo_dwd_product_movie_basic_info ATTACH PARTITION holo_dwd_product_movie_basic_info_${bizdate} FOR VALUES in ('${bizdate}');
        
        COMMIT;
  5. 調度配置。

    Hologres SQL編輯頁面,單擊節點編輯地區右側的調度配置,配置節點的調度屬性。

    說明

    需要更改的參數如下,未提及參數請保持預設值。

    • 基礎屬性

      參數

      參數

      bizdate=${yyyymmdd}

    • 時間屬性時間屬性

      參數

      產生執行個體方式

      發布後即時產生

      重跑屬性

      運行成功後不可重跑,運行失敗後可以重跑

      定時調度時間

      00:05

    • 調度依賴

      調度依賴為root節點即可(也可以根據商務邏輯選擇已有的父節點)。請先將代碼解析選擇為,然後單擊代碼解析,會自動解析出root節點,最後再將代碼解析選擇為

  6. 發布調度。

    1. Hologres SQL編輯頁面,單擊工具列中的儲存表徵圖,儲存節點。

    2. 單擊工具列中的提交表徵圖,提交節點。

    3. 提交新版本對話方塊中,輸入變更描述

    4. 單擊確認

  7. 營運中心發布。

    1. Hologres SQL編輯頁面,單擊工具列中最右側的營運

    2. 進入營運中心頁面,單擊左側功能表列周期任務營運>周期任務

    3. 周期任務頁面,按右鍵節點,選擇補資料>當前節點

      補資料

    4. 選擇左側功能表列周期任務營運 > 補資料執行個體,查看正在啟動並執行任務以及任務狀態。

  8. 查看資料。

    任務執行成功之後,將會在Hologres中自動建立對應分區資料的分區子表。

    1. 進入DataStudio資料開發頁面,建立Hologres SQL節點。

    2. 在節點的編輯頁面,輸入如下語句,進行資料查詢。

      • 查看分區子表資料。

        select * from holo_dwd_product_movie_basic_info_20170112;
      • 查看分區父表總資料。

        select count (*) from holo_dwd_product_movie_basic_info;