このトピックでは、HologresでSQLステートメントを実行してMaxComputeにデータをエクスポートする方法について説明します。
前提条件
MaxComputeがアクティブ化されており、開発ツールがMaxComputeに接続されている
Hologresインスタンスが作成され、開発ツールがインスタンスに接続されています。詳細については、「HoloWebへの接続とクエリの発行」をご参照ください。
制限事項
Hologres V0.9以降でのみ、SQLステートメントを実行してMaxComputeにデータをエクスポートできます。 Hologresインスタンスのバージョンが V0.9より前の場合、HologresコンソールでHologresインスタンスを手動でアップグレードするか、Hologres DingTalkグループに参加してインスタンスのアップグレードを申請する必要があります。 Hologresインスタンスを手動でアップグレードする方法の詳細については、「インスタンスのアップグレード」トピックの手動アップグレードセクションをご参照ください。 Hologres DingTalkグループへの参加方法の詳細については、「Hologresのオンライン サポートを受ける」をご参照ください。
Hologresのデータ型はMaxComputeのデータ型にマッピングされます。 Hologres V1.3より前のバージョンでは、Hologresは DATE、ARRAY、MAP、STRUCTなどの複合データ型をサポートしていません。 Hologres V1.3以降では、ARRAY型と DATE型のデータをMaxComputeに書き込むことができます。 HologresとMaxCompute間のデータ型マッピングの詳細については、「データ型」をご参照ください。
Hologres V1.1以降では、MaxComputeにデータをエクスポートできます。 Hologresインスタンスのバージョンが V1.1より前の場合は、
INSERTステートメントの前に次のステートメントを追加する必要があります。-- このステートメントは、Hologres V0.9およびV0.10で必須です。 set hg_experimental_enable_write_maxcompute = on;HologresでSQLステートメントを実行して、MaxComputeのトランザクション テーブルにデータをエクスポートすることはできません。
注意事項
HologresでSQLステートメントを実行してMaxComputeにデータをエクスポートする場合は、次の点に注意してください。
Hologresでは、リージョンをまたいでMaxComputeにデータをエクスポートできます。ただし、Hologresインスタンスと宛先のMaxComputeプロジェクトが同じリージョンにある場合、ネットワークがより安定しているため、データ エクスポートのパフォーマンスが向上します。
Hologresは最大 1 レベルのパーティションをサポートしますが、MaxComputeテーブルのサブパーティションにデータをエクスポートできます。 MaxComputeテーブルのサブパーティションにデータをエクスポートするには、MaxComputeテーブルのパーティション キー値をソース Hologresテーブルのフィールドにマッピングする必要があります。さらに、Hologresでは、パーティション化されたHologresテーブルからパーティション化されていないMaxComputeテーブルにデータをエクスポートできます。
MaxCompute書き込みサーバーの数は限られています。パフォーマンスを向上させるために、早朝などのピーク時にはMaxComputeにデータをエクスポートしないことをお勧めします。
TIMESTAMPTZ型のフィールドが存在する場合、フィールドの有効値の範囲は 1677-09-21 00:00:00~2262-04-12 00:00:00です。
手順
MaxComputeにデータをエクスポートするために、Hologresに内部テーブルを作成します。この例では、holo_sourceという名前の内部テーブルが作成されます。
データを受信するためにMaxComputeテーブルを作成します。たとえば、mc_sinkという名前のテーブルを作成できます。
Hologres内部テーブルのデータをMaxComputeテーブルにマッピングするために、Hologresに外部テーブルを作成します。この例では、mapping_foreign_tableという名前の外部テーブルが作成されます。
必要に応じて、Hologresで次のSQLステートメントを実行して、MaxComputeにデータをエクスポートします。
説明Hologres V2.1.17以降では、サーバーレス コンピューティング機能がサポートされています。サーバーレス コンピューティング機能は、大量のデータをオフラインでインポートする場合、大規模な抽出、変換、ロード(ETL)ジョブを実行する場合、または外部テーブルから大量のデータをクエリする場合に適しています。サーバーレス コンピューティング機能を使用して、追加のサーバーレス コンピューティング リソースに基づいて前述の操作を実行できます。これにより、インスタンスに追加のコンピューティング リソースを予約する必要がなくなります。これにより、インスタンスの安定性が向上し、メモリ不足(OOM)エラーの発生が減少します。タスクで使用される追加のサーバーレス コンピューティング リソースに対してのみ課金されます。サーバーレス コンピューティング機能の詳細については、「サーバーレス コンピューティング」をご参照ください。サーバーレス コンピューティング機能の使用方法の詳細については、「サーバーレス コンピューティングのユーザー ガイド」をご参照ください。
-- オプション。大量のデータをオフラインでインポートし、抽出、変換、ロード(ETL)ジョブを実行するには、サーバーレス コンピューティング機能を使用することをお勧めします。 SET hg_computing_resource = 'serverless'; -- 指定されたフィールドのデータをエクスポートします。 INSERT INTO mapping_foreign_table SELECT x,x,x FROM holo_soruce;-- x,x,xをエクスポートするフィールドの名前に置き換えます。 -- すべてのフィールドのデータをエクスポートします。 INSERT INTO mapping_foreign_table SELECT * FROM holo_soruce; -- 設定をリセットします。これにより、後続のSQLステートメントでサーバーレス コンピューティング リソースが使用されなくなります。 RESET hg_computing_resource;
以下のセクションでは、パーティション化されていないテーブル間とパーティション化されたテーブル間でデータを同期する方法について説明します。
パーティション化されていないHologresテーブルからパーティション化されていないMaxComputeテーブルにデータをエクスポートする
データ ソースとしてHologresに内部テーブルを作成します。
MaxComputeにデータをエクスポートするために、Hologres内部テーブルを作成できます。次のサンプル コードは、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;データを受信するためにMaxComputeテーブルを作成します。
次のサンプル コードは、データを受信するためにMaxComputeテーブルを作成する方法を示しています。 MaxComputeテーブルのフィールドとデータ型は、Hologres内部テーブルのフィールドとデータ型に対応している必要があります。構文の詳細については、「テーブル操作」をご参照ください。
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 '定期預金の有無' );Hologres内部テーブルのデータをMaxComputeテーブルにマッピングするために、Hologresに外部テーブルを作成します。
Hologresに外部テーブルを作成し、この外部テーブルを使用してMaxComputeテーブルにデータをマッピングできます。または、「外部テーブルのインポート」ステートメントを実行して、MaxComputeテーブルに対応する外部テーブルをHologresに作成することもできます。次のサンプル コードは、Hologresに外部テーブルを作成する方法を示しています。
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 'xxx',table_name 'mc_bank');-- project_nameパラメーターを宛先MaxComputeプロジェクトの名前に、table_nameパラメーターを宛先MaxComputeテーブルの名前に置き換えます。 COMMIT;次の表は、上記の構文のパラメーターについて説明しています。
パラメーター
説明
project_name
宛先MaxComputeプロジェクトの名前。
table_name
宛先MaxComputeテーブルの名前。
HologresからMaxComputeにデータをエクスポートします。
次のステートメントを実行して、Hologresから宛先MaxComputeテーブルにデータをエクスポートします。指定されたフィールドのデータ、またはすべてのフィールドのデータをエクスポートできます。フィールドは、Hologres内部テーブルと同じ順序で指定する必要があります。
-- オプション。大量のデータをオフラインでインポートし、ETLジョブを実行するには、サーバーレス コンピューティング機能を使用することをお勧めします。 SET hg_computing_resource = 'serverless'; -- 指定されたフィールドのデータをエクスポートします。 INSERT INTO mapping_bank SELECT age,job FROM bank; -- すべてのフィールドのデータをエクスポートします。 INSERT INTO mapping_bank SELECT * FROM bank; -- 設定をリセットします。これにより、後続のSQLステートメントでサーバーレス コンピューティング リソースが使用されなくなります。 RESET hg_computing_resource;
パーティション化されたHologresテーブルからパーティション化されたMaxComputeテーブルにデータをエクスポートする
データ ソースとしてHologresに内部テーブルを作成します。
MaxComputeにデータをエクスポートするために、Hologres内部テーブルを作成できます。次のサンプル コードは、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');データを受信するためにMaxComputeテーブルを作成します。
次のサンプル コードは、データを受信するためにMaxComputeテーブルを作成する方法を示しています。 MaxComputeテーブルには、1 レベルまたは 2 レベルのパーティションを含めることができます。 MaxComputeテーブルのフィールドとデータ型は、Hologres内部テーブルのフィールドとデータ型に対応している必要があります。構文の詳細については、「テーブル操作」をご参照ください。
-- ケース 1: 1 レベルのパーティションのみを含むMaxComputeテーブルを作成します。 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: 2 レベルのパーティションを含むMaxComputeテーブルを作成します。 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');Hologres内部テーブルのデータをMaxComputeテーブルにマッピングするために、Hologresに外部テーブルを作成します。
Hologresに外部テーブルを作成し、この外部テーブルを使用してHologres内部テーブルのデータをMaxComputeテーブルにマッピングできます。次のサンプル コードは、Hologresに外部テーブルを作成する方法を示しています。
-- 1 レベルのパーティションのみを含むMaxComputeテーブルにHologres内部テーブルのデータをマッピングするために、外部テーブルを作成します。 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 'xxx',table_name 'mc_par_bank'); COMMIT; -- 2 レベルのパーティションを含むMaxComputeテーブルにHologres内部テーブルのデータをマッピングするために、外部テーブルを作成します。 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 'xxx',table_name 'mc_par_bank_2');// project_nameパラメーターを宛先MaxComputeプロジェクトの名前に、table_nameパラメーターを宛先MaxComputeテーブルの名前に置き換えます。 COMMIT;次の表は、上記の構文のパラメーターについて説明しています。
パラメーター
説明
project_name
宛先MaxComputeプロジェクトの名前。
table_name
宛先MaxComputeテーブルの名前。
HologresからMaxComputeにデータをエクスポートします。
次のステートメントを実行して、Hologresから宛先MaxComputeテーブルにデータをエクスポートします。指定されたフィールドのデータ、またはすべてのフィールドのデータをエクスポートできます。フィールドは、Hologres内部テーブルと同じ順序で指定する必要があります。
-- オプション。大量のデータをオフラインでインポートし、ETLジョブを実行するには、サーバーレス コンピューティング機能を使用することをお勧めします。 SET hg_computing_resource = 'serverless'; -- 単一レベルのパーティションを含むMaxComputeテーブルにデータをエクスポートします。 -- 例 1: WHERE句を使用して、Hologresの親パーティション テーブルからデータをエクスポートします。 INSERT INTO mapping_par_bank SELECT * FROM "public"."par_bank" WHERE ds='20190830'; -- 例 2: Hologresの対応する子テーブルからデータをエクスポートします。 insert into mapping_par_bank select * from "public"."par_bank_20190901"; -- 2 レベルのパーティションを含むMaxComputeテーブルにデータをエクスポートします。 -- 例 1: WHERE句を使用して、Hologresの親パーティション テーブルからデータをエクスポートします。 INSERT INTO mapping_par_bank_2 SELECT * FROM "public"."par_bank" WHERE y='1' and ds='20190830'; -- 例 2: Hologresの子パーティション テーブルからデータをエクスポートします。 INSERT INTO mapping_par_bank_2 SELECT * FROM "public"."par_bank_20190901" where y='1'; -- 設定をリセットします。これにより、後続のSQLステートメントでサーバーレス コンピューティング リソースが使用されなくなります。 RESET hg_computing_resource;
FAQ
問題の説明
MaxComputeテーブルにデータをエクスポートすると、
internal error: odps_writer_xxx,UploadId: xxx, Block 0 close odps writer failed: RequestId=xxx, ErrorCode=FlowExceeded, ErrorMessage= GlobalSlot Quotaというエラー メッセージが返されます。原因
HologresでSQLステートメントを使用してMaxComputeにデータをエクスポートする場合、高パフォーマンスのデータ エクスポートを確保するために、MaxComputeのTunnel SDKサービスが使用されます。詳細については、「Tunnelコマンド」をご参照ください。ただし、MaxComputeのTunnel SDKサービスを使用する場合、同時書き込みリクエストの数とデータ サイズが制限されます。詳細については、「制限」をご参照ください。 MaxComputeのTunnel SDKサービスのピーク時に、書き込みタスクが書き込み制限をトリガーした場合、上記のエラー メッセージが返されます。
解決策
MaxComputeにデータを再度エクスポートします。
MaxComputeにデータを再度エクスポートした後もエラーが解決しない場合は、次のステートメントを実行して、MaxComputeへの同時データ書き込みのレートを設定します。
-- MaxComputeへの同時データ書き込みのレートを設定します。 hg_experimental_write_maxcompute_dopパラメーターを 0 からシャード数までの値に設定することをお勧めします。 set hg_experimental_write_maxcompute_dop =<count>;