このトピックでは、MaxCompute のパーティションテーブルから Hologres のパーティションテーブルにデータをインポートする方法について説明します。
前提条件
-
Hologres インスタンスを購入し、有効化していること。詳細については、「Hologresインスタンスの購入」をご参照ください。
-
MaxCompute を有効化し、プロジェクトを作成していること。詳細については、「MaxComputeの有効化」をご参照ください。
-
DataWorks を有効化し、ワークスペースを作成していること。詳細については、「ワークスペースの作成」をご参照ください。
背景情報
Hologres の外部テーブルを使用して MaxCompute データにアクセスすることは、一般的なデータインジェストのパターンです。定期的なインポートには、DataWorks の強力なスケジューリング機能とタスクオーケストレーション機能を使用して、インポートワークフローを自動化する単一の定期タスクを設定できます。詳細については、「DataWorks タスクの例」をご参照ください。
タスクは複雑なため、DataWorks 移行アシスタントを使用してタスクのサンプルファイルをプロジェクトにインポートできます。これにより、すぐに使用できるワークフローが提供され、特定のビジネスニーズに合わせてパラメーターやスクリプトを変更してカスタマイズできます。詳細については、「移行アシスタントを使用した DataWorks タスクのインポート」をご参照ください。
注意事項
-
一時テーブルを使用して原子性を確保します。インポートが完了した後にのみ、データをパーティションテーブルにアタッチします。これにより、インポートタスクが失敗した場合にテーブルを削除するなどの手動クリーンアップ操作の必要がなくなります。
-
子パーティションのデータを更新する場合、トランザクションの一貫性を確保するために、単一のトランザクション内で古い子パーティションを削除し、新しい一時テーブルをアタッチする必要があります。
-
移行アシスタントを使用して DataWorks タスクをインポートするには、次の条件を満たす必要があります。
-
DataWorks のエディションは Standard Edition 以降である必要があります。詳細については、「DataWorksのエディション」をご参照ください。
-
DataWorks のワークスペースは、MaxCompute および Hologres のデータソースに紐付けられている必要があります。詳細については、「ワークスペースの設定」をご参照ください。
-
操作手順
-
MaxCompute データの準備
-
DataWorks コンソールにログインします。 ターゲットリージョンで、左側のナビゲーションウィンドウからを選択します。 [データ分析に移動]をクリックします。 次に、左側のナビゲーションウィンドウで
アイコンをクリックして、SQL Query ページに移動します。 -
[SQL Query] ページで、次の SQL ステートメントを入力してパーティションテーブルを作成し、Run をクリックします。
DROP TABLE IF EXISTS odps_sale_detail; -- 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 Query] ページで、次の SQL ステートメントを入力してパーティションテーブルにデータをインポートし、Run をクリックします。
-- ソーステーブルに 20210815 パーティションを追加します。 ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='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') ; -- パーティションにデータを書き込みます。 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') ; -- パーティションにデータを書き込みます。 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') ; -- パーティションにデータを書き込みます。 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 開発ページで、Metadata Management をクリックします。
-
[Metadata Management] ページで、左側のディレクトリツリーにある作成済みデータベースの名前をダブルクリックし、その後、[OK] をクリックします。

-
-
外部テーブルの作成
-
SQL Editor ページで、左上隅の
アイコンをクリックして新しい SQL クエリを作成します。 -
新しい Ad-hoc Query ページで、Instance Name と データベース を選択します。SQL エディターに次のステートメントを入力し、Run をクリックします。
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 開発ページで、Metadata Management をクリックします。
-
[Metadata Management] ページで、左側のディレクトリツリーにある作成済みデータベースの名前をダブルクリックし、その後、[OK] をクリックします。

-
-
パーティションテーブルの作成
-
SQL Editor ページで、左上隅の
アイコンをクリックして新しい SQL クエリを作成します。 -
新しい Ad-hoc Query ページで、Instance Name と データベース を選択します。SQL エディターに次のステートメントを入力し、Run をクリックします。
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 の一時テーブルへのパーティションデータのインポート
Ad-hoc Query ページで、SQL エディターに次のステートメントを入力し、Run をクリックします。
この 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 パーティションテーブルへの一時テーブルのアタッチ
Ad-hoc Query ページで、SQL エディターに次のステートメントを入力し、Run をクリックします。
-
古い子パーティションが存在する場合は、まずそれを削除してから、一時テーブルを 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; -- 一時テーブルをパーティションテーブルにアタッチします。 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; -- 一時テーブルをパーティションテーブルにアタッチします。 ALTER TABLE holo_sale_detail ATTACH PARTITION holo_sale_detail_20210816 FOR VALUES IN ('20210816'); COMMIT ;
-
-
Hologres パーティションテーブルでの ANALYZE の実行
Ad-hoc Query ページで、SQL エディターに次のステートメントを入力し、Run をクリックします。
この SQL ステートメントは、
holo_sale_detailパーティションテーブルに対してANALYZEを実行して統計情報を収集します。これは、クエリプランナーが効率的な実行計画を生成するのに役立ちます。パーティションテーブルに対してANALYZEを実行する場合、親テーブルに対してのみ実行します。-- 大規模なデータインポート後に、パーティションテーブルの親テーブルで ANALYZE を実行します。 ANALYZE holo_sale_detail; -
期限切れの子パーティションのクリーンアップ (オプション)
本番環境では、データにはライフサイクルがあり、保持期間を過ぎたパーティションをクリーンアップする必要があります。
Ad-hoc Query ページで、SQL エディターに次のステートメントを入力し、Run をクリックします。
この SQL ステートメントは、20210630 パーティションをクリーンアップします。
DROP TABLE IF EXISTS holo_sale_detail_20210630;
DataWorks タスクの例
日常の運用では、上記の SQL ステートメントを定期的に実行する必要が頻繁にあります。スケジューリングとオーケストレーションには DataWorks を使用でき、単一のスケジュールタスクで両方のシナリオをカバーできます。移行アシスタントを使用して DataWorks タスクをインポートする際に、ビジネスニーズに合わせてパラメーターやスクリプトを更新できるよう、以下のセクションをよくお読みください。次の図は、全体的なワークフローを示しています。
ワークフローモジュール
-
基本パラメーター
基本パラメーターには、ワークフローで使用されるすべてのパラメーターが含まれます。主なパラメーターは次のとおりです:
ID
パラメーター
タイプ
値
説明
1
datepre31
variable
${yyyymmdd-31}
期限切れのパーティションのクリーンアップを制御するパラメーター。この値は、31 日前のパーティションをクリーンアップすることを示します。
2
datetime1
variable
$bizdate
パーティションの作成を制御するパラメーター。
3
holo_table_name
constant
holo_sale_detail
Hologres パーティションテーブルの名前。
4
odps_project
constant
hologres_test
MaxCompute プロジェクトの名前。
5
odps_table_name
constant
odps_sale_detail
MaxCompute パーティションテーブルの名前。
6
partition_key
constant
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;このモジュールの上流入力として基本パラメーターを紐付ける必要があります。このノードの [Node Context] 設定で、[Input Parameters of This Node] セクションには
datetime1、holo_table_name、odps_project、odps_table_name、partition_keyの 5 つのパラメーターが含まれます。すべてのパラメーターの値のソースは、上流ノードholo_doc_test.501890067_outです。手動で追加してください。[Output Parameters of This Node] セクションは空です。 -
子パーティションの置換
この手順は、既存の子パーティションを置き換える Hologres SQL モジュールです。操作は原子性を確保するためにトランザクション内で実行されます。SQL コードは次のとおりです:
-- 子パーティションが存在する場合は置き換えます。 BEGIN ; -- 既存の子パーティションを削除します。 DROP TABLE IF EXISTS ${holo_table_name}_${datetime1}; -- 一時テーブルの名前を変更します。 ALTER TABLE ${holo_table_name}_tmp_${datetime1} RENAME TO ${holo_table_name}_${datetime1}; -- 一時テーブルをパーティションテーブルにアタッチします。 ALTER TABLE ${holo_table_name} ATTACH PARTITION ${holo_table_name}_${datetime1} FOR VALUES IN ('${datetime1}'); COMMIT ;このモジュールの上流入力として基本パラメーターを紐付ける必要があります。[Node Context] の [Input Parameters of This Node] で、パラメーター
datetime1とholo_table_nameを手動で追加します。値のソースを、それぞれ上流ノードの出力hologres_doc_test.502282431_out:datetime1とhologres_doc_test.502282431_out:holo_table_nameに設定します。 -
パーティションテーブルの統計情報収集
この手順は、親テーブルの統計情報を収集する Hologres SQL モジュールです。SQL コードは次のとおりです:
-- 大規模なデータインポート後に、パーティションテーブルの親テーブルで ANALYZE を実行します。 ANALYZE ${holo_table_name};このモジュールの上流入力として基本パラメーターを紐付ける必要があります。[Node Context] の [Input Parameters of This Node] で [Add] をクリックし、パラメーター
holo_table_nameを手動で追加します。値のソースをholo_doc_test.501890067_out:holo_table_nameに設定します。 -
期限切れの子パーティションのクリーンアップ
本番環境では、データにはライフサイクルがあり、保持期間を過ぎたパーティションをクリーンアップする必要があります。
この例では、Hologres に過去 31 日間のパーティションのみを保存する方法を示します。パラメーターが datepre31=${yyyymmdd-31} に設定されているため、期限切れの子パーティションを削除する SQL コードは次のようになります:物理的なパーティションテーブルの子パーティションを削除する前に、まず親テーブルからデタッチ (DETACH PARTITION) し、次に DROP TABLE を実行する必要があります。そうしないと、子パーティションは親テーブルにアタッチされたままになります。
-- 期限切れの子パーティションのクリーンアップ:最初に子パーティションをデタッチし、次にテーブルをドロップします。 BEGIN ; ALTER TABLE ${holo_table_name} DETACH PARTITION ${holo_table_name}_${datepre31}; DROP TABLE IF EXISTS ${holo_table_name}_${datepre31}; COMMIT ;たとえば、
bizdateが 20200309 の場合、datepre31は 20200207 になります。これにより、パーティションクリーンアップの日付が正しく設定されます。また、このモジュールの上流入力として基本パラメーターを紐付ける必要があります。[Node Context] パネルの [Input Parameters of This Node] セクションで、[Add] をクリックし、手動で 2 つのパラメーターを追加します。パラメーター名
datepre31の値のソースを上流ノードの出力holo_doc_test.501890067_out:datepre31に設定し、パラメーター名holo_table_nameの値のソースを上流ノードの出力holo_doc_test.501890067_out:holo_table_nameに設定します。
移行アシスタントを使用した DataWorks タスクのインポート
-
タスクは複雑なため、DataWorks 移行アシスタントを使用して提供されたタスクパッケージをプロジェクトにインポートできます。これにより、このトピックで説明されている事前設定済みの DataWorks タスクが提供され、特定のビジネスニーズに合わせてパラメーターやスクリプトを変更してカスタマイズできます。
-
次のタスクパッケージをダウンロードしてください:DataWorks タスクパッケージ。
-
DataWorks 移行アシスタントを開きます。詳細については、「移行アシスタントを開く」をご参照ください。
-
移行アシスタントの左側のナビゲーションウィンドウで、 をクリックします。
-
DataWorks import ページで、右上隅の Create Import Task をクリックします。
-
Create Import Task ダイアログボックスで、パラメーターを設定します。
パラメーター
説明
Import Package Name
カスタム名。インポート名には、大文字、小文字、漢字、数字、アンダースコア (_)、ピリオド (.) を含めることができます。
Upload Method
ファイルをアップロードする方法:
-
Upload Local File:この方法を使用して、30 MB 以下のエクスポートパッケージファイルを DataWorks ワークスペースにアップロードします。
-
OSS Endpoint:エクスポートパッケージファイルが 30 MB を超える場合は、ファイルを OSS にアップロードし、DataWorks ワークスペースにファイル URL を入力します。ファイル URL を取得するには、OSS コンソールのファイル詳細ページに移動し、[File Url] セクションを見つけて URL をコピーします。ファイルのアップロード方法の詳細については、「ファイルのアップロード」をご参照ください。OSS のダウンロードリンクの取得方法の詳細については、「ファイルの共有」をご参照ください。
備考
インポートタスクの簡単な説明。
-
-
OK をクリックして Import Task Settings ページに移動し、マッピングを設定します。
-
左下隅の Start Import をクリックし、Confirm ダイアログボックスで OK をクリックします。
-
インポートが成功すると、上記で説明したスケジュールタスクが [Data Development] モジュールに表示されます。
-
関連する DDL ステートメントも手動ワークフローに表示されます。
-