外部テーブルを作成して MaxCompute テーブルにマッピングし、INSERT INTO ... SELECT 文を実行して、Hologres から MaxCompute にデータをエクスポートします。このアプローチは、非パーティションテーブルとパーティションテーブルの両方に適用できます。
前提条件
開始する前に、以下の準備が整っていることを確認してください。
-
開発ツールが接続された、アクティブな MaxCompute プロジェクト。詳細については、「MaxCompute の使用開始」をご参照ください。
-
開発ツールが接続された Hologres インスタンス (V0.9 以降)。詳細については、「HoloWeb を使用した接続とクエリ」をご参照ください。
制限事項
バージョン要件:
|
Hologres のバージョン |
実行内容 |
|
V1.1 以降 |
|
|
V0.9 または V0.10 |
各 |
|
V0.9 より前 |
まずインスタンスをアップグレードします。アップグレードをリクエストするには、「アップグレード準備エラーのトラブルシューティング」をご参照いただくか、Hologres DingTalk グループに参加してサポートを受けてください。詳細については、「オンラインサポートをさらに受けるには」をご参照ください。 |
データ型のサポート:
Hologres V1.3 以降では、ARRAY 型と DATE 型の MaxCompute へのエクスポートに対応しています。それより前のバージョンでは、複合型 (DATE、ARRAY、MAP、STRUCT) には対応していません。データ型のマッピングについては、「MaxCompute と Hologres 間のデータ型マッピング」をご参照ください。
その他の制限事項:
-
MaxCompute のトランザクションテーブルへのデータエクスポートには対応していません。
-
TIMESTAMPTZ フィールドの場合、有効な値の範囲は
1677-09-21 00:00:00から2262-04-12 00:00:00です。
使用上の注意
-
クロスリージョンでのエクスポート: 対応していますが、同一リージョンにデプロイした方が、ネットワーク接続が安定しているため、パフォーマンスが向上します。
-
パーティションのサポート: Hologres は 1 階層のパーティションのみに対応していますが、MaxCompute の 2 レベルパーティションにデータをエクスポートできます。この場合、MaxCompute のパーティションキーの値と Hologres テーブル内の対応するフィールドを正しくマッピングする必要があります。また、Hologres のパーティションテーブルから MaxCompute の非パーティションテーブルにエクスポートすることもできます。
-
ピーク時: MaxCompute Tunnel SDK は、同時書き込みとデータ量を制限します。クォータ制限に達する可能性を減らすために、ピーク時 (早朝など) のエクスポートは避けてください。
-
フィールドの順序: Hologres テーブルに表示されるのと同じ順序でフィールドを指定してください。
非パーティションテーブルからのデータのエクスポート
エクスポートプロセスは、次の 3 つのステップで構成されます。
-
エクスポートするデータを含む Hologres 内部テーブルを作成または特定します。
-
データを受け取るための MaxCompute テーブルを作成します。
-
MaxCompute テーブルにマッピングする外部テーブルを Hologres に作成し、
INSERT INTO ... SELECTを実行してデータをコピーします。
ステップ 1: Hologres 内部テーブルの作成とテストデータの挿入
BEGIN;
CREATE TABLE "public"."bank" (
"age" int8,
"job" text,
"marital" text,
"education" text,
"card" text,
"housing" text,
"loan" text,
"contact" text,
"month" text,
"day_of_week" text,
"duration" text,
"campaign" int8,
"pdays" float8,
"previous" float8,
"poutcome" text,
"emp_var_rate" float8,
"cons_price_idx" float8,
"cons_conf_idx" float8,
"euribor3m" float8,
"nr_employed" float8,
"y" int8
);
COMMIT;
INSERT INTO "public"."bank" VALUES
(32, 'farmer', 'married', 'university.degree', 'yes', 'yes', 'no', 'cellular', 'may', 'mon', '261', 1, 999, 0, 'nonexistent', 1.1, 93.994, -36.4, 4.857, 5191.0, 0),
(45, 'technician', 'single', 'basic.9y', 'no', 'no', 'no', 'telephone', 'jul', 'thu', '149', 2, 6, 2, 'success', -1.8, 94.215, -41.8, 4.962, 5228.1, 1),
(28, 'teacher', 'divorced', 'high.school', 'yes', 'yes', 'yes', 'cellular', 'nov', 'tue', '385', 3, 999, 0, 'nonexistent', -2.9, 93.444, -42.7, 1.044, 4991.6, 0),
(13, 'student', 'married', 'professional.course', 'yes', 'no', 'no', 'cellular', 'aug', 'fri', '672', 1, 12, 5, 'failure', 0.7, 93.918, -37.2, 4.000, 5076.2, 1),
(37, 'doctor', 'single', 'unknown', 'no', 'no', 'no', 'telephone', 'dec', 'wed', '210', 5, 999, 0, 'nonexistent', 1.4, 92.893, -46.2, 1.211, 5099.1, 0);
ステップ 2: MaxCompute テーブルの作成
フィールドの順序とデータ型は、Hologres の内部テーブルと一致させる必要があります。MaxCompute のテーブル構文については、「テーブル操作」をご参照ください。
CREATE TABLE IF NOT EXISTS mc_bank
(
age BIGINT COMMENT '年齢',
job STRING COMMENT 'ジョブタイプ',
marital STRING COMMENT '婚姻状況',
education STRING COMMENT '学歴',
card STRING COMMENT 'クレジットカードの有無',
housing STRING COMMENT '住宅ローン',
loan STRING COMMENT 'ローン',
contact STRING COMMENT '連絡先',
month STRING COMMENT '月',
day_of_week STRING COMMENT '曜日',
duration STRING COMMENT '期間',
campaign BIGINT COMMENT 'キャンペーン中の連絡回数',
pdays DOUBLE COMMENT '最終連絡からの経過時間',
previous DOUBLE COMMENT '顧客との連絡回数',
poutcome STRING COMMENT '前回のマーケティングキャンペーンの結果',
emp_var_rate DOUBLE COMMENT '雇用変動率',
cons_price_idx DOUBLE COMMENT '消費者物価指数',
cons_conf_idx DOUBLE COMMENT '消費者信頼感指数',
euribor3m DOUBLE COMMENT 'ユーロ預金金利',
nr_employed DOUBLE COMMENT '従業員数',
y BIGINT COMMENT '定期預金の有無'
);
ステップ 3: Hologres での外部テーブルの作成
MaxCompute テーブルにマッピングする外部テーブルを Hologres に作成します。または、Import Foreign Schema 文を使用して、外部テーブル定義を自動生成することもできます。
BEGIN;
CREATE FOREIGN TABLE "public"."mapping_bank" (
"age" int8,
"job" text,
"marital" text,
"education" text,
"card" text,
"housing" text,
"loan" text,
"contact" text,
"month" text,
"day_of_week" text,
"duration" text,
"campaign" int8,
"pdays" float8,
"previous" float8,
"poutcome" text,
"emp_var_rate" float8,
"cons_price_idx" float8,
"cons_conf_idx" float8,
"euribor3m" float8,
"nr_employed" float8,
"y" int8
)
SERVER odps_server
OPTIONS (project_name '<maxcompute-project-name>', table_name 'mc_bank');
COMMIT;
|
パラメーター |
説明 |
|
|
エクスポート先の MaxCompute プロジェクトの名前 |
|
|
エクスポート先の MaxCompute テーブルの名前 |
ステップ 4: データのエクスポート
すべてのフィールドのエクスポート:
-- オプション:大規模なオフラインインポートや ETL ジョブには、サーバーレスコンピューティングを使用します。
SET hg_computing_resource = 'serverless';
INSERT INTO mapping_bank
SELECT * FROM bank;
-- 後続のステートメントでサーバーレスコンピューティングリソースが使用されないよう、リセットします。
RESET hg_computing_resource;
選択したフィールドのエクスポート:
INSERT INTO mapping_bank (age, job)
SELECT age, job FROM bank;
Hologres V2.1.17 以降では、サーバーレスコンピューティングがサポートされています。大規模なオフラインデータインポート、大規模な ETL ジョブ、外部テーブルに対する大量のクエリなどのシナリオでは、サーバーレスコンピューティングを使用してこれらのタスクを実行できます。この機能は、インスタンスリソースの代わりに、追加のサーバーレスリソースを使用するため、インスタンスの安定性が向上し、メモリ不足 (OOM) エラーの可能性が低くなります。インスタンスに追加のコンピューティングリソースを確保する必要はなく、実行したタスクに対してのみ課金されます。サーバーレスコンピューティングの詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティングの使用方法については、「サーバーレスコンピューティングの使用」をご参照ください。
パーティションテーブルからのデータのエクスポート
エクスポートプロセスは、非パーティションテーブルの場合と同じ 3 つのステップで構成されます。主な違いは、MaxCompute テーブルに 1 階層または 2 レベルのパーティションを設定でき、それに応じてパーティションキーの値をマッピングする必要がある点です。
ステップ 1: Hologres パーティションテーブルの作成
BEGIN;
CREATE TABLE "public"."par_bank" (
"age" int8,
"job" text,
"marital" text,
"education" text,
"default" text,
"housing" text,
"loan" text,
"contact" text,
"month" text,
"day_of_week" text,
"duration" text,
"campaign" int8,
"pdays" float8,
"previous" float8,
"poutcome" text,
"emp_var_rate" float8,
"cons_price_idx" float8,
"cons_conf_idx" float8,
"euribor3m" float8,
"nr_employed" float8,
"y" int8,
"ds" text
)
PARTITION BY list (ds);
COMMIT;
-- 子テーブルを作成します。
CREATE TABLE "public"."par_bank_20190830" PARTITION OF "public"."par_bank" FOR VALUES IN ('20190830');
CREATE TABLE "public"."par_bank_20190901" PARTITION OF "public"."par_bank" FOR VALUES IN ('20190901');
ステップ 2: MaxCompute テーブルの作成
MaxCompute テーブルには、1 階層または 2 レベルのパーティションを設定できます。フィールドとデータ型は、Hologres の内部テーブルと一致させる必要があります。MaxCompute のテーブル構文については、「テーブル操作」をご参照ください。
1 階層パーティション:
CREATE TABLE IF NOT EXISTS mc_par_bank
(
age BIGINT COMMENT '年齢',
job STRING COMMENT 'ジョブタイプ',
marital STRING COMMENT '婚姻状況',
education STRING COMMENT '学歴',
default STRING COMMENT 'クレジットカードの有無',
housing STRING COMMENT '住宅ローン',
loan STRING COMMENT 'ローン',
contact STRING COMMENT '連絡先',
month STRING COMMENT '月',
day_of_week STRING COMMENT '曜日',
duration STRING COMMENT '期間',
campaign BIGINT COMMENT 'キャンペーン中の連絡回数',
pdays DOUBLE COMMENT '最終連絡からの経過時間',
previous DOUBLE COMMENT '顧客との連絡回数',
poutcome STRING COMMENT '前回のマーケティングキャンペーンの結果',
emp_var_rate DOUBLE COMMENT '雇用変動率',
cons_price_idx DOUBLE COMMENT '消費者物価指数',
cons_conf_idx DOUBLE COMMENT '消費者信頼感指数',
euribor3m DOUBLE COMMENT 'ユーロ預金金利',
nr_employed DOUBLE COMMENT '従業員数',
y BIGINT COMMENT '定期預金の有無'
)
PARTITIONED BY
(
ds STRING
);
ALTER TABLE mc_par_bank ADD IF NOT EXISTS PARTITION (ds='20190830');
ALTER TABLE mc_par_bank ADD IF NOT EXISTS PARTITION (ds='20190901');
2 レベルパーティション:
CREATE TABLE IF NOT EXISTS mc_par_bank_2
(
age BIGINT COMMENT '年齢',
job STRING COMMENT 'ジョブタイプ',
marital STRING COMMENT '婚姻状況',
education STRING COMMENT '学歴',
default STRING COMMENT 'クレジットカードの有無',
housing STRING COMMENT '住宅ローン',
loan STRING COMMENT 'ローン',
contact STRING COMMENT '連絡先',
month STRING COMMENT '月',
day_of_week STRING COMMENT '曜日',
duration STRING COMMENT '期間',
campaign BIGINT COMMENT 'キャンペーン中の連絡回数',
pdays DOUBLE COMMENT '最終連絡からの経過時間',
previous DOUBLE COMMENT '顧客との連絡回数',
poutcome STRING COMMENT '前回のマーケティングキャンペーンの結果',
emp_var_rate DOUBLE COMMENT '雇用変動率',
cons_price_idx DOUBLE COMMENT '消費者物価指数',
cons_conf_idx DOUBLE COMMENT '消費者信頼感指数',
euribor3m DOUBLE COMMENT 'ユーロ預金金利',
nr_employed DOUBLE COMMENT '従業員数'
)
PARTITIONED BY
(
y BIGINT,
ds STRING
);
ALTER TABLE mc_par_bank_2 ADD IF NOT EXISTS PARTITION (y='1', ds='20190830');
ALTER TABLE mc_par_bank_2 ADD IF NOT EXISTS PARTITION (y='1', ds='20190901');
ステップ 3: Hologres での外部テーブルの作成
MaxCompute の 1 階層パーティションの場合:
BEGIN;
CREATE FOREIGN TABLE "public"."mapping_par_bank" (
"age" int8,
"job" text,
"marital" text,
"education" text,
"default" text,
"housing" text,
"loan" text,
"contact" text,
"month" text,
"day_of_week" text,
"duration" text,
"campaign" int8,
"pdays" float8,
"previous" float8,
"poutcome" text,
"emp_var_rate" float8,
"cons_price_idx" float8,
"cons_conf_idx" float8,
"euribor3m" float8,
"nr_employed" float8,
"y" int8,
"ds" text
)
SERVER odps_server
OPTIONS (project_name '<maxcompute-project-name>', table_name 'mc_par_bank');
COMMIT;
MaxCompute の 2 レベルパーティションの場合:
BEGIN;
CREATE FOREIGN TABLE "public"."mapping_par_bank_2" (
"age" int8,
"job" text,
"marital" text,
"education" text,
"default" text,
"housing" text,
"loan" text,
"contact" text,
"month" text,
"day_of_week" text,
"duration" text,
"campaign" int8,
"pdays" float8,
"previous" float8,
"poutcome" text,
"emp_var_rate" float8,
"cons_price_idx" float8,
"cons_conf_idx" float8,
"euribor3m" float8,
"nr_employed" float8,
"y" int8,
"ds" text
)
SERVER odps_server
OPTIONS (project_name '<maxcompute-project-name>', table_name 'mc_par_bank_2');
COMMIT;
|
パラメーター |
説明 |
|
|
エクスポート先の MaxCompute プロジェクトの名前 |
|
|
エクスポート先の MaxCompute テーブルの名前 |
ステップ 4: データのエクスポート
MaxCompute の 1 階層パーティションへのエクスポート:
-- オプション:一括ロードおよび ETL タスクにはサーバーレスコンピューティングを使用します。
SET hg_computing_resource = 'serverless';
-- オプション 1: 親テーブルに挿入し、WHERE 句でパーティションを絞り込みます。
INSERT INTO mapping_par_bank SELECT * FROM "public"."par_bank" WHERE ds='20190830';
-- オプション 2: 子テーブルに直接挿入します。
INSERT INTO mapping_par_bank SELECT * FROM "public"."par_bank_20190901";
-- 後続のステートメントでサーバーレスコンピューティングリソースが使用されないよう、リセットします。
RESET hg_computing_resource;
MaxCompute の 2 レベルパーティションへのエクスポート:
-- オプション:一括ロードおよび ETL タスクにはサーバーレスコンピューティングを使用します。
SET hg_computing_resource = 'serverless';
-- オプション 1: 親テーブルにクエリを実行し、WHERE 句で両方のパーティション階層で絞り込みます。
INSERT INTO mapping_par_bank_2 SELECT * FROM "public"."par_bank" WHERE y='1' AND ds='20190830';
-- オプション 2: 子パーティションテーブルにクエリを実行し、2番目の階層のパーティションで絞り込みます。
INSERT INTO mapping_par_bank_2 SELECT * FROM "public"."par_bank_20190901" WHERE y='1';
-- 後続のステートメントでサーバーレスコンピューティングリソースが使用されないよう、リセットします。
RESET hg_computing_resource;
よくある質問
MaxCompute へのエクスポート時に FlowExceeded エラーが発生するのはなぜですか?
問題の説明: MaxCompute Tunnel SDK サービスのピーク時 (早朝など) に、書き込みタスクが同時書き込みまたはデータ量の制限を超えると発生します。
原因: Hologres は、MaxCompute Tunnel SDK を使用して、高性能なデータエクスポートを実行します。Tunnel SDK は、共有インフラストラクチャを保護するために、同時書き込みリクエストとデータサイズに制限を設けています。詳細については、「Tunnel コマンド」および「MaxCompute の制限事項」をご参照ください。
解決策:
-
エクスポートを再試行してください。
-
エラーが解決しない場合は、書き込みの同時実行数を調整してください。
-- 0 からテーブルのシャード数までの間の値に設定します。
SET hg_experimental_write_maxcompute_dop = <count>;