DataWorks のスケジューリングタスクを使用すると、データ転送の時間と頻度を設定できます。これにより、プロセス中のデータ整合性と正確性が保証されます。DataWorks を使用して、MaxCompute のパーティションテーブルから Hologres のパーティションテーブルにデータをインポートできます。このアプローチは、両方のプラットフォームの利点を組み合わせ、データ処理の効率と信頼性を向上させます。
前提条件
Hologres インスタンスを購入して有効化していること。詳細については、「Hologres インスタンスの購入」をご参照ください。
MaxCompute を有効化し、プロジェクトを作成していること。詳細については、「MaxCompute と DataWorks の有効化」をご参照ください。
DataWorks を有効化し、ワークスペースを作成していること。詳細については、「ワークスペースの作成」をご参照ください。
注意事項
MaxCompute のテナントまたはプロジェクトレベルでスキーマサービスが有効になっていないことを確認してください。スキーマの詳細については、「スキーマ操作」をご参照ください。
手順
MaxCompute データを準備します。
DataWorks コンソールにログインします。ターゲットリージョンに切り替えます。左側のナビゲーションウィンドウで、 を選択します。[Go To Data Analytics] をクリックします。左側のナビゲーションウィンドウで、
アイコンをクリックして [SQL Query] ページに移動します。[SQL Query] ページで、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 URL' ) PARTITIONED BY (ds STRING) STORED AS ALIORC;[SQL Query] ページで、次の SQL 文を入力してパーティションテーブルのデータを表示し、[実行] をクリックします。
20170112パーティションのデータを表示SELECT * FROM public_data.dwd_product_movie_basic_info WHERE ds = '20170112';
Hologres に外部テーブルを作成します。
Hologres で外部テーブルを作成して、ソースの MaxCompute テーブルをマッピングできます。外部テーブルのフィールドの順序とデータの型は、MaxCompute テーブルのものと一致している必要があります。
HoloWeb コンソール SQL エディター ページにログインします。
[SQLエディター] タブの下にある
アイコンをクリックして、[一時クエリ] ウィンドウを開きます。 クエリウィンドウのツールバーで、Hologres の [インスタンス名] と [データベース] を選択します。[Ad-hoc Query] ウィンドウのエディターで、次の文を入力して [実行] をクリックします。
次の文では、
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');
Hologres で内部テーブルを作成します。
Hologres で内部テーブルを作成して、データを受信および保存できます。
[HoloWeb] 開発ページで、[New SQL Window] をクリックします。
新しい [Ad-hoc Query] ページで、[インスタンス名] と [データベース] を選択します。次に、SQL エディターで次の文を入力し、[実行] をクリックします。
この例では、MaxCompute のパーティションテーブルを Hologres にインポートします。したがって、Hologres で作成する内部テーブルもパーティションテーブルである必要があります。
説明次の `CREATE TABLE` 文は簡単な例です。必要に応じてテーブルを作成し、適切なインデックスを設定して、クエリパフォーマンスを向上させることができます。
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 ID'; COMMIT;
新しいパーティション分割された子テーブルを開発します。
このステップでは、Hologres SQL モジュールを使用して、パーティションテーブルのジョブをスケジュールします。
DataWorks コンソールにログインし、[データ開発] ページに移動して、Hologres SQL ノードを作成します。詳細については、「Hologres SQL ノード」をご参照ください。
ノードエディターページで、次の文を入力します。
Hologres は、親パーティションテーブルへのデータの直接書き込みをサポートしていません。MaxCompute ソーステーブルのパーティションキー値に対応する子パーティションテーブルを Hologres に作成する必要があります。その後、パーティションデータを対応する子テーブルにインポートできます。パーティションキー値は、${bizdate} パラメーターによって制御されます。スケジューリングシステムは、定期的なスケジューリングのためにこのパラメーターに値を自動的に割り当てます。スケジューリングパラメーターの詳細については、「サポートされているスケジューリングパラメーターのフォーマット」をご参照ください。
説明インポートされたパーティションデータは、パーティションキー値と一致する必要があります。この例では、パーティションキーは ds です。そうでない場合、エラーが発生します。
データインポートのロジックはシナリオによって異なる場合があります。参考として、次の 2 つのシナリオが提供されています。必要に応じていずれかを選択できます。
シナリオ 1: 新しいパーティションデータをインポートする。
-- 一時的な子パーティションテーブルを作成します。 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'); -- Hologres にインポートする前に 30 秒間待機します。これにより、Hologres メタデータのキャッシュ更新が遅いことによる同期の失敗を防ぎます。 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;シナリオ 2: 履歴パーティションデータを更新する。
-- 一時的な子パーティションテーブルを作成します。 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'); -- Hologres にインポートする前に 30 秒間待機します。これにより、Hologres メタデータのキャッシュ更新が遅いことによる同期の失敗を防ぎます。 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;
スケジューリングを設定します。
[Hologres SQL] エディターページで、ノードエディターの右側にある [スケジュール] をクリックして、ノードのスケジューリングプロパティを設定します。
説明次のパラメーターを変更し、その他はデフォルト値のままにします。
基本プロパティ
パラメーター
値
パラメーター
bizdate=${yyyymmdd}
時間プロパティ

パラメーター
値
インスタンス生成モード
デプロイ後にインスタンスを生成
再実行プロパティ
実行成功後は再実行できません。実行失敗後は再実行できます。
スケジュールされた時間
00:05
スケジューリングの依存関係
依存関係をルートノードに設定できます。必要に応じて、既存の親ノードを選択することもできます。まず、[コードの解析] を [はい] に設定し、次に [コードの解析] をクリックします。ルートノードが自動的に解析されます。最後に、[コードの解析] を [いいえ] に設定します。
スケジューリングタスクを公開します。
[Hologres SQL] エディターページで、ツールバーの
アイコンをクリックしてノードを保存します。ツールバーの
アイコンをクリックしてノードを送信します。[新しいバージョンを送信] ダイアログボックスで、[変更の説明] を入力します。
[OK] をクリックします。
オペレーションセンターでタスクを公開します。
[Hologres SQL] エディターページで、ツールバーの右上隅にある [O&M] をクリックします。
[オペレーションセンター] ページで、左側のナビゲーションウィンドウで [定期タスク O&M] > [定期タスク] を選択します。
[定期タスク] ページで、ノードを右クリックし、[データのバックフィル] > [現在のノード] を選択します。

左側のナビゲーションウィンドウで、[定期タスク O&M] > [バックフィルインスタンス] を選択して、実行中のタスクとそのステータスを表示します。
データを表示します。
タスクが正常に実行されると、対応するパーティションデータのパーティション分割された子テーブルが Hologres に自動的に作成されます。
[データ開発] ページに移動し、Hologres SQL ノードを作成します。詳細については、「Hologres SQL ノード」をご参照ください。
ノードエディターページで、次の文を入力してデータをクエリします。
パーティション分割された子テーブルのデータを表示します。
SELECT * FROM holo_dwd_product_movie_basic_info_20170112;親パーティションテーブルの合計データを表示します。
SELECT COUNT (*) FROM holo_dwd_product_movie_basic_info;