このトピックでは、MaxCompute パーティションテーブルから Hologres パーティションテーブルにデータをインポートする方法について説明します。
前提条件
Hologres インスタンスを購入し、アクティブ化していること。詳細については、「Hologres インスタンスの購入」をご参照ください。
MaxCompute をアクティブ化し、MaxCompute プロジェクトを作成していること。詳細については、「MaxCompute のアクティブ化」をご参照ください。
DataWorks をアクティブ化し、DataWorks ワークスペースを作成していること。詳細については、「ワークスペースの作成」をご参照ください。
背景情報
Hologres で MaxCompute 外部テーブルを使用することは、データをインポートする一般的な方法です。日常の操作では、データを定期的にインポートする必要があることがよくあります。DataWorks を使用してジョブをスケジュールおよびオーケストレーションできます。これにより、両方のシナリオをカバーする単一のジョブで定期的なインポートが可能になります。詳細については、「DataWorks ジョブの例」をご参照ください。
ジョブが複雑な場合は、DataWorks 移行アシスタントを使用します。サンプルジョブファイルをプロジェクトにインポートします。その後、ビジネスに応じてパラメーターまたはスクリプトを調整します。詳細については、「移行ツールを使用した DataWorks ジョブのインポート」をご参照ください。
注意事項
一時テーブルを使用して原子性を確保します。インポートが完了した後にのみ、一時テーブルをパーティションテーブルにバインドします。これにより、インポートが失敗した場合の手動クリーンアップを回避できます。
子パーティションのデータを更新する場合は、既存の子テーブルを削除し、新しい一時テーブルを単一のトランザクションでアタッチします。これにより、トランザクションの一貫性が確保されます。
移行ツールを使用して DataWorks ジョブをインポートするには、次の要件を満たす必要があります。
ご利用の DataWorks エディションは Standard Edition 以降である必要があります。詳細については、「バージョン別の機能詳細」をご参照ください。
ご利用の DataWorks ワークスペースは、MaxCompute と Hologres の両方のデータソースにアタッチされている必要があります。詳細については、「ワークスペースの構成」をご参照ください。
詳細な手順
MaxCompute データの準備
DataWorks コンソールにログインします。DataWorks コンソール。ターゲットリージョンで、左側のナビゲーションウィンドウからを選択します。「[データ分析に移動]」をクリックします。次に、左側のナビゲーションウィンドウで、
アイコンをクリックして、「SQL Query」ページに移動します。[SQL クエリ] ページで、次の 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 クエリ] ページで、パーティションテーブルにデータをインポートするには、次の 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 ステートメントは、hologres_test プロジェクトの odps_sale_detail パーティションテーブルから 20210816 パーティションを、Hologres の holo_sale_detail パーティションテーブルの 20210816 パーティションにインポートします。
説明Hologres はバージョン 2.1.17 以降、Serverless Computing をサポートしています。大規模なオフラインインポート、大規模な ETL ジョブ、および大量の外部テーブルクエリの場合、Serverless Computing はインスタンスのリソースではなく、追加のサーバーレスリソースを使用します。これにより、安定性が向上し、メモリ不足 (OOM) エラーが減少します。実行したタスクに対してのみ料金が発生します。詳細については、「Serverless Computing」をご参照ください。使用方法については、「Serverless Computing ユーザーガイド」をご参照ください。
-- 潜在的な一時テーブルをクリーンアップします 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 ジョブに Serverless Computing を使用します 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 を Hologres の 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 を実行します ANALYZE holo_sale_detail;期限切れの子パーティションのクリーンアップ (オプション)
本番環境では、データにはライフサイクルがあります。必要に応じて、期限切れのパーティションをクリーンアップします。
Ad-hoc Query ページで、SQL エディターに次の文を入力し、Run をクリックします。
この SQL ステートメントは、20210631 パーティションをクリーンアップします。
DROP TABLE IF EXISTS holo_sale_detail_20210631;
DataWorks ジョブの例
前述の SQL ステートメントをスケジュールに基づいて実行する必要があることがよくあります。DataWorks を使用してジョブをスケジュールおよびオーケストレーションします。単一のスケジュールされたジョブで両方のシナリオをカバーできます。以下の内容を注意深くお読みください。これは、移行ツールを使用して DataWorks ジョブをインポートする際に、パラメーターまたはスクリプトをカスタマイズするのに役立ちます。全体的なワークフローを以下に示します。
ビジネスフローモジュールの詳細
基本パラメーター
基本パラメーターは、ワークフローで使用されるすべてのパラメーターを管理します。主要なパラメーターは次のとおりです。
ID
パラメーター名
タイプ
値
説明
1
datepre31
変数
${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 はバージョン 2.1.17 以降、Serverless Computing をサポートしています。大規模なオフラインインポート、大規模な ETL ジョブ、および大量の外部テーブルクエリの場合、Serverless Computing はインスタンスのリソースではなく、追加のサーバーレスリソースを使用します。これにより、安定性が向上し、メモリ不足 (OOM) エラーが減少します。実行したタスクに対してのみ料金が発生します。詳細については、「Serverless Computing」をご参照ください。使用方法については、「Serverless Computing ユーザーガイド」をご参照ください。
-- 潜在的な一時テーブルをクリーンアップします 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 ジョブに Serverless Computing を使用します 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 モジュールです。既存の子テーブルを置き換えます。置き換えプロセスをトランザクションでラップして、一貫性を確保します。その 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 ;このモジュールの上流に基本パラメーターをバインドして、パラメーター変数を制御します。システム構成を以下に示します。

パーティションテーブルの統計情報収集
このステップは Hologres SQL モジュールです。親テーブルの統計情報を収集します。その SQL コードは次のとおりです。
-- 大量のデータをインポートした後、親テーブルで ANALYZE を実行します ANALYZE ${holo_table_name};このモジュールの上流に基本パラメーターをバインドして、パラメーター変数を制御します。システム構成を以下に示します。

期限切れの子テーブルのクリーンアップ
本番環境では、データにはライフサイクルがあります。必要に応じて、期限切れのパーティションをクリーンアップします。
たとえば、Hologres で過去 31 日間のパーティションのみを保持します。パラメーター datepre31=${yyyymmdd-31} が以前に設定されたため、期限切れの子テーブルをクリーンアップする SQL コードは次のとおりです。物理パーティションの子テーブルを削除する前に、親テーブルからデタッチします (DETACH PARTITION)。そうしないと、子テーブルは親テーブルにアタッチされたままになります。
-- 期限切れの子テーブルをクリーンアップします: 最初にデタッチし、次に削除します 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 です。これにより、パーティションのクリーンアップの目標が達成されます。
このモジュールの上流に基本パラメーターをバインドして、パラメーター変数を制御します。システム構成を以下に示します。

移行ツールを使用した DataWorks ジョブのインポート
ジョブが複雑な場合は、DataWorks 移行アシスタントを使用します。次のファイルをプロジェクトにインポートします。これにより、上記の DataWorks ジョブが取得されます。その後、ビジネスに応じてパラメーターまたはスクリプトを調整します。
ジョブパッケージをダウンロードします。DataWorks ジョブパッケージ
DataWorks 移行アシスタントを開きます。詳細については、「移行アシスタントを開く」をご参照ください。
移行アシスタントの左側のナビゲーションウィンドウで、 をクリックします。
[DataWorks インポート] ページで、右上隅の [インポートタスクの作成] をクリックします。
[インポートタスクの作成]ダイアログボックスで、パラメーターを設定します。

パラメーター
説明
インポート名
カスタム名。インポート名には、文字、数字、アンダースコア (_)、およびピリオド (.) のみを含めることができます。
アップロード方法
ファイルのアップロード方法。
ローカルアップロード: エクスポートされたパッケージファイルが 30 MB 以下の場合にこの方法を使用します。
OSS URL: エクスポートされたパッケージファイルが 30 MB を超える場合は、OSS にアップロードします。OSS コンソールのファイル詳細ページから URL をコピーします。OSS URL を DataWorks ワークスペースに貼り付けます。OSS アップロード手順については、「コンソールでファイルをアップロードする」をご参照ください。OSS ダウンロード URL の取得方法については、「ファイルを共有する」をご参照ください。

備考
インポートタスクの簡単な説明。
[OK] をクリックします。[インポートタスク設定] ページに移動します。マッピングを設定します。
左下隅の [インポートの開始] をクリックします。[確認] ダイアログボックスで、OK をクリックします。
インポートが成功すると、定期的なジョブがデータ開発モジュールに表示されます。
関連する DDL ステートメントも手動ワークフローに表示されます。