このトピックでは、パーティション化されたMaxComputeテーブルからパーティション化されたHologresテーブルにデータをインポートする方法について説明します。
前提条件
Hologresインスタンスが購入済みであること。詳細については、「Hologresインスタンスの購入」をご参照ください。
MaxComputeがアクティブ化されていること。MaxComputeプロジェクトが作成されていること。 MaxComputeのアクティブ化方法の詳細については、「MaxComputeとDataWorksのアクティブ化」をご参照ください。
DataWorksがアクティブ化されていること。DataWorksワークスペースが作成されていること。 DataWorksワークスペースの作成方法の詳細については、「ワークスペースの作成」をご参照ください。
背景情報
Hologresの外部テーブルは、MaxComputeからHologresにデータをインポートするために広く使用されています。データのインポートは、日常業務で頻繁に必要になります。この場合、DataWorksの強力なスケジューリング機能とジョブオーケストレーション機能を使用して、定期的なスケジューリングを実装し、自動トリガーワークフローを設定してデータをインポートできます。詳細については、「DataWorksワークフローのサンプル」をご参照ください。
ワークフローは複雑です。そのため、DataWorksのMigration Assistantサービスを使用して、サンプルDataWorksワークフローのパッケージをワークスペースにインポートし、ワークフローを作成できます。その後、ビジネス要件に基づいて一部のパラメーターまたはスクリプトを変更できます。詳細については、「Migration Assistantサービスを使用してDataWorksワークフローをインポートする」をご参照ください。
注意事項
一時テーブルは、操作の原子性を確保するために使用されます。一時テーブルは、テーブルデータがインポートされた後にのみ、パーティションテーブルにアタッチされます。この場合、データのインポートに失敗した場合、テーブルを削除する必要はありません。
既存の子パーティションテーブルのデータを更新するシナリオでは、子パーティションテーブルの削除と一時テーブルのアタッチをトランザクションに配置して、トランザクションの原子性、一貫性、分離性、耐久性(ACID)プロパティを確保する必要があります。
Migration Assistantサービスを使用してDataWorksワークフローをインポートするための前提条件:
DataWorks Standard Edition以上がアクティブ化されていること。詳細については、「DataWorksエディション間の違い」をご参照ください。
MaxComputeとHologresのデータソースがDataWorksワークスペースに追加されていること。詳細については、「ワークスペースの作成と管理」をご参照ください。
手順
MaxComputeデータを準備します。
MaxComputeコンソールにログインします。
左側のナビゲーションペインで、 を選択します。
[SQLクエリ] ページで、次のSQLステートメントを入力し、[実行] アイコンをクリックして、パーティションテーブルを作成します。
DROP TABLE IF EXISTS odps_sale_detail; -- odps_sale_detail という名前のパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS odps_sale_detail ( shop_name STRING ,customer_id STRING ,total_price DOUBLE ) PARTITIONED BY ( sale_date STRING ) ;[SQLクエリ] ページで、次のSQLステートメントを入力し、[実行] アイコンをクリックして、パーティションテーブルにデータをインポートします。
-- パーティションテーブルに 20210815 パーティションを作成します。 ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210815') ; -- 20210815 パーティションにデータをインポートします。 INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210815') VALUES ('s1','c1',100.1), ('s2','c2',100.2), ('s3','c3',100.3) ; -- パーティションテーブルに 20210816 パーティションを作成します。 ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210816') ; -- 20210816 パーティションにデータをインポートします。 INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210816') VALUES ('s1','c1',100.1), ('s2','c2',100.2), ('s3','c3',100.3) ; -- パーティションテーブルに 20210817 パーティションを作成します。 ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210817') ; -- 20210817 パーティションにデータをインポートします。 INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210817') VALUES ('s1','c1',100.1), ('s2','c2',100.2), ('s3','c3',100.3) ; -- パーティションテーブルに 20210818 パーティションを作成します。 ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210818') ; -- 20210818 パーティションにデータをインポートします。 INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210818') VALUES ('s1','c1',100.1), ('s2','c2',100.2), ('s3','c3',100.3) ;
Hologresにテーブルを作成します。
外部テーブルを作成します。
データベースにログインします。
HoloWebコンソールで、上部ナビゲーションバーの [メタデータ管理] をクリックします。
[メタデータ管理] タブで、左側のナビゲーションペインで作成したデータベースを見つけ、データベース名をダブルクリックします。表示されるダイアログボックスで、[OK] をクリックします。

外部テーブルを作成します。
[SQLエディター] タブの左上隅にある
アイコンをクリックします。[アドホッククエリ] タブで、[インスタンス] ドロップダウンリストからインスタンスを選択し、[データベース] ドロップダウンリストからデータベースを選択し、SQLエディターに次のサンプルステートメントを入力して、[実行] をクリックします。
DROP FOREIGN TABLE IF EXISTS odps_sale_detail; -- 外部テーブルを作成します。 IMPORT FOREIGN SCHEMA maxcompute_project LIMIT to ( odps_sale_detail ) FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'error',if_unsupported_type 'error');
内部パーティションテーブルを作成します。
データベースにログインします。
HoloWebコンソールで、上部ナビゲーションバーの [メタデータ管理] をクリックします。
[メタデータ管理] タブで、左側のナビゲーションペインで作成したデータベースを見つけ、データベース名をダブルクリックします。表示されるダイアログボックスで、[OK] をクリックします。

パーティションテーブルを作成します。
[SQLエディター] タブの左上隅にある
アイコンをクリックします。[アドホッククエリ] タブで、[インスタンス] ドロップダウンリストからインスタンスを選択し、[データベース] ドロップダウンリストからデータベースを選択し、SQLエディターに次のサンプルステートメントを入力して、[実行] をクリックします。
DROP TABLE IF EXISTS holo_sale_detail; -- Hologresに内部パーティションテーブルを作成します。 BEGIN ; CREATE TABLE IF NOT EXISTS holo_sale_detail ( shop_name TEXT ,customer_id TEXT ,total_price FLOAT8 ,sale_date TEXT ) PARTITION BY LIST(sale_date); COMMIT;
パーティションからHologres一時テーブルにデータをインポートします。
[アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。
次のSQLステートメントは、MaxComputeプロジェクト hologres_test 内のパーティションテーブル odps_sale_detail の 20210816 パーティションのデータを、Hologres内のパーティションテーブル holo_sale_detail の 20210816 パーティションにインポートするために使用されます。
説明Hologres V2.1.17以降では、サーバーレスコンピューティング機能がサポートされています。サーバーレスコンピューティング機能は、大量のデータをオフラインでインポートする場合、大規模な抽出、変換、ロード(ETL)ジョブを実行する場合、または外部テーブルから大量のデータをクエリする場合に適しています。サーバーレスコンピューティング機能を使用して、追加のサーバーレスコンピューティングリソースに基づいて前述の操作を実行できます。これにより、インスタンスに追加のコンピューティングリソースを予約する必要がなくなります。これにより、インスタンスの安定性が向上し、メモリ不足(OOM)エラーの発生が減少します。タスクで使用される追加のサーバーレスコンピューティングリソースに対してのみ課金されます。サーバーレスコンピューティング機能の詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティング機能の使用方法の詳細については、「サーバーレスコンピューティングのユーザーガイド」をご参照ください。
-- 既存の一時テーブルを削除します。 BEGIN ; DROP TABLE IF EXISTS holo_sale_detail_tmp_20210816; COMMIT ; -- 一時テーブルを作成します。 SET hg_experimental_enable_create_table_like_properties=on; BEGIN ; CALL HG_CREATE_TABLE_LIKE ('holo_sale_detail_tmp_20210816', 'select * from holo_sale_detail'); COMMIT; -- オプション。大量のデータをオフラインでインポートし、ETLジョブを実行するには、サーバーレスコンピューティング機能を使用することをお勧めします。 SET hg_computing_resource = 'serverless'; -- 一時テーブルにデータを挿入します。 INSERT INTO holo_sale_detail_tmp_20210816 SELECT * FROM public.odps_sale_detail WHERE sale_date='20210816'; -- 設定をリセットします。これにより、後続のSQLステートメントでサーバーレスコンピューティングリソースが使用されないようになります。 RESET hg_computing_resource;一時テーブルをパーティション化されたHologresテーブルにアタッチします。
[アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。
特定のパーティションに対応する子テーブルが存在する場合は、一時テーブルをHologresパーティションテーブルにアタッチする前に、既存の子テーブルを削除します。
次のSQLステートメントは、既存の子パーティションテーブル holo_sale_detail_20210816 を削除し、一時テーブル holo_sale_detail_tmp_20210816 をパーティションテーブル holo_sale_detail の 20210816 パーティションにアタッチするために使用されます。
-- 特定のパーティションに対応する子パーティションテーブルが存在する場合は、子パーティションテーブルを置き換えます。 BEGIN ; -- 既存の子パーティションテーブルを削除します。 DROP TABLE IF EXISTS holo_sale_detail_20210816; -- 一時テーブルの名前を変更します。 ALTER TABLE holo_sale_detail_tmp_20210816 RENAME TO holo_sale_detail_20210816; -- 一時テーブルをパーティション化されたHologresテーブルにアタッチします。 ALTER TABLE holo_sale_detail ATTACH PARTITION holo_sale_detail_20210816 FOR VALUES IN ('20210816') ; COMMIT ;特定のパーティションに対応する子パーティションテーブルが存在しない場合は、一時テーブルをHologresパーティションテーブルにアタッチします。
次のSQLステートメントは、一時テーブル holo_sale_detail_tmp_20210816 をパーティションテーブル holo_sale_detail の 20210816 パーティションにアタッチするために使用されます。
BEGIN ; -- 一時テーブルの名前を変更します。 ALTER TABLE holo_sale_detail_tmp_20210816 RENAME TO holo_sale_detail_20210816; -- 一時テーブルをパーティション化されたHologresテーブルにアタッチします。 ALTER TABLE holo_sale_detail ATTACH PARTITION holo_sale_detail_20210816 FOR VALUES IN ('20210816'); COMMIT ;
パーティション化されたHologresテーブルの統計を収集します。
[アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。
次のSQLステートメントは、パーティションテーブル holo_sale_detail の統計を収集し、パーティションテーブルの実行計画を確認するために使用されます。親パーティションテーブルの統計のみを収集する必要があります。
-- 大量のデータがインポートされた後、親パーティションテーブルの統計を収集します。 ANALYZE holo_sale_detail;オプション。期限切れのパーティションに対応する子パーティションテーブルを削除します。
本番環境では、データには有効期限(TTL)があります。期限切れのパーティションに対応する子パーティションテーブルを削除する必要があります。
[アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。
次のSQLステートメントは、 20210631 パーティションに対応する子パーティションテーブルを削除するために使用されます。
DROP TABLE IF EXISTS holo_sale_detail_20210631;
DataWorksワークフローのサンプル
日常業務では、前述のSQLステートメントを定期的に実行する必要があります。この場合、DataWorksの強力なスケジューリング機能とジョブオーケストレーション機能を使用して、定期的なスケジューリングを実装し、自動トリガーワークフローを設定してデータをインポートできます。次の内容は、Migration Assistantサービスを使用してDataWorksワークフローをインポートする際に、ビジネス要件に基づいて一部のパラメーターまたはスクリプトを変更するのに役立ちます。
ワークフロー内のノード
基本パラメーター
基本パラメーターは、ワークフロー全体で使用されるすべてのパラメーターを管理するために使用されます。次の表は、基本パラメーターについて説明しています。
番号
パラメーター
タイプ
有効な値
説明
1
datepre31
変数
${yyyymmdd-31}
期限切れのパーティションに対応する子パーティションテーブルを削除するための条件。 ${yyyymmdd-31} は、指定された日付の 31 日前に生成されたパーティションに対応する子パーティションテーブルを削除することを示します。
2
datetime1
変数
$bizdate
管理対象のパーティションを作成しました。
3
holo_table_name
定数
holo_sale_detail
パーティション化されたHologresテーブルの名前。
4
odps_project
定数
hologres_test
MaxComputeプロジェクトの名前。
5
odps_table_name
定数
odps_sale_detail
パーティション化されたMaxComputeテーブルの名前。
6
partition_key
定数
sale_date
MaxComputeテーブルのパーティションフィールド。
次の図は、基本パラメーターのシステム構成を示しています。

特定のパーティションのデータを一時テーブルにインポートします。
これはHologres SQLノードであり、次のSQLステートメントが含まれています。
説明Hologres V2.1.17以降では、サーバーレスコンピューティング機能がサポートされています。サーバーレスコンピューティング機能は、大量のデータをオフラインでインポートする場合、大規模な抽出、変換、ロード(ETL)ジョブを実行する場合、または外部テーブルから大量のデータをクエリする場合に適しています。サーバーレスコンピューティング機能を使用して、追加のサーバーレスコンピューティングリソースに基づいて前述の操作を実行できます。これにより、インスタンスに追加のコンピューティングリソースを予約する必要がなくなります。これにより、インスタンスの安定性が向上し、メモリ不足(OOM)エラーの発生が減少します。タスクで使用される追加のサーバーレスコンピューティングリソースに対してのみ課金されます。サーバーレスコンピューティング機能の詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティング機能の使用方法の詳細については、「サーバーレスコンピューティングのユーザーガイド」をご参照ください。
-- 既存の一時テーブルを削除します。 BEGIN ; DROP TABLE IF EXISTS ${holo_table_name}_tmp_${datetime1}; COMMIT ; -- 一時テーブルを作成します。 SET hg_experimental_enable_create_table_like_properties=on; BEGIN ; CALL HG_CREATE_TABLE_LIKE ('${holo_table_name}_tmp_${datetime1}', 'select * from ${holo_table_name}'); COMMIT; -- 一時テーブルにデータを挿入します。 -- オプション。大量のデータをオフラインでインポートし、ETLジョブを実行するには、サーバーレスコンピューティング機能を使用することをお勧めします。 SET hg_computing_resource = 'serverless'; INSERT INTO ${holo_table_name}_tmp_${datetime1} SELECT * FROM public.${odps_table_name} WHERE ${partition_key}='${datetime1}'; -- 設定をリセットします。これにより、後続のSQLステートメントでサーバーレスコンピューティングリソースが使用されないようになります。 RESET hg_computing_resource;基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。

特定のパーティションに対応する子パーティションテーブルを置き換えます。
これは、パーティションに対応する子パーティションテーブルが存在する場合にデータを更新するために使用されるHologres SQLノードです。子パーティションテーブルの置き換えをトランザクションに配置して、トランザクションのACIDプロパティを確保します。ノードには、次のSQLステートメントが含まれています。
-- 特定のパーティションに対応する子パーティションテーブルが存在する場合は、子パーティションテーブルを置き換えます。 BEGIN ; -- 既存の子パーティションテーブルを削除します。 DROP TABLE IF EXISTS ${holo_table_name}_${datetime1}; -- 一時テーブルの名前を変更します。 ALTER TABLE ${holo_table_name}_tmp_${datetime1} RENAME TO ${holo_table_name}_${datetime1}; -- 一時テーブルをパーティション化されたHologresテーブルにアタッチします。 ALTER TABLE ${holo_table_name} ATTACH PARTITION ${holo_table_name}_${datetime1} FOR VALUES IN ('${datetime1}'); COMMIT ;基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。

パーティションテーブルの統計を収集します。
これは、親パーティションテーブルの統計を収集するために使用されるHologres SQLノードです。ノードには、次のSQLステートメントが含まれています。
-- 大量のデータがインポートされた後、親パーティションテーブルの統計を収集します。 ANALYZE ${holo_table_name};基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。

期限切れのパーティションに対応する子パーティションテーブルを削除します。
本番環境では、データにはTTLがあります。期限切れのパーティションに対応する子パーティションテーブルを削除する必要があります。
たとえば、Hologresに過去 31 日間に生成されたパーティションに対応する子パーティションテーブルのみを保存する場合、datepre31 パラメーターは ${yyyymmdd-31} に設定されます。この場合、期限切れのパーティションに対応する子パーティションテーブルを削除するために使用されるノードには、次のSQLステートメントが含まれています。
-- 期限切れのパーティションに対応する子パーティションテーブルを削除します。 BEGIN ; DROP TABLE IF EXISTS ${holo_table_name}_${datepre31}; COMMIT ;ワークフローの実行時に、bizdateパラメーターの値が 20200309 の場合、datepre31パラメーターの値は 20200207 になります。この場合、2020年 2 月 7 日より前に生成されたパーティションに対応する子パーティションテーブルが削除されます。
基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。

Migration Assistantサービスを使用してDataWorksワークフローをインポートする
前述のDataWorksワークフローは複雑です。そのため、DataWorksのMigration Assistantサービスを使用して、サンプルDataWorksワークフローのパッケージをプロジェクトにインポートし、サンプルDataWorksワークフローを取得できます。その後、ビジネス要件に基づいて一部のパラメーターまたはスクリプトを変更できます。
次の手順を実行する前に、サンプルDataWorksワークフローのパッケージをダウンロードしてください。
DataWorksのMigration Assistantホームページに移動します。詳細については、「Migration Assistantページに移動する」をご参照ください。
Migration Assistantページの左側のナビゲーションペインで、 を選択します。
[dataworksインポート] ページの右上隅にある [インポートタスクの作成] をクリックします。
[インポートタスクの作成] ダイアログボックスで、パラメーターを設定します。

パラメーター
説明
[名前]
カスタム名を指定します。名前には、文字、数字、アンダースコア(_)、ピリオド(.)を含めることができます。
[アップロード元]
アップロードするパッケージのソース。
[ローカル]: パッケージのサイズが 30 MB 以下の場合、コンピューターからDataWorksワークスペースにパッケージをアップロードします。
[OSS]: パッケージのサイズが 30 MB を超える場合、パッケージをオブジェクトストレージサービス(OSS)にアップロードし、パッケージのOSS URLを指定します。OSSコンソールの View Details パネルでパッケージのOSS URLをコピーし、取得したOSS URLを指定してパッケージをDataWorksワークスペースにアップロードできます。OSSへのオブジェクトのアップロード方法の詳細については、「オブジェクトのアップロード」をご参照ください。オブジェクトのOSS URLの取得方法の詳細については、「オブジェクトの共有」をご参照ください。

[備考]
インポートタスクの説明。
[OK] をクリックします。[インポートタスクの設定] ページで、マッピングを設定します。
右上隅にある [インポート] をクリックします。[確認] メッセージで、[OK] をクリックします。
パッケージがインポートされると、前述の自動トリガーワークフローがDataStudioに表示されます。
関連するDDLステートメントが、手動でトリガーされたワークフローに表示されます。