すべてのプロダクト
Search
ドキュメントセンター

Hologres:SQLステートメントを実行してMaxComputeからHologresにデータをインポートする

最終更新日:Jan 11, 2025

MaxComputeのビジネスデータのサイズが 200 GBを超え、クエリの複雑さが高く、数秒以内にレスポンスを返す必要がある場合は、クエリのためにビジネスデータをMaxComputeからHologres内部テーブルにインポートできます。このクエリ方法では、インデックスを設定でき、外部テーブルに基づくクエリよりも高いクエリ効率を実現できます。このトピックでは、MaxComputeからHologresにデータをインポートする方法と、よくある質問への回答について説明します。

使用上の注意

SQLステートメントを実行してMaxComputeからHologresにデータをインポートする場合は、次の点に注意してください。

  • MaxComputeテーブルのパーティションフィールドは、Hologresテーブルのパーティションフィールドまたは通常のフィールドにマッピングできます。パーティション化されたMaxComputeテーブルからパーティション化されたHologresテーブルまたはパーティション化されていないHologresテーブルにデータをインポートできます。

  • Hologresは1レベルのパーティション化をサポートしています。MaxComputeは複数レベルのパーティション化をサポートしています。複数レベルのパーティション化を含むMaxComputeテーブルからパーティション化されたHologresテーブルにデータをインポートする場合は、MaxComputeテーブルの第1レベルのパーティションフィールドのみをHologresテーブルのパーティションフィールドにマッピングする必要があります。MaxComputeテーブルの他のパーティションフィールドは、Hologresテーブルの通常のフィールドにマッピングされます。

  • データをインポートするときに既存のデータを上書きするには、INSERT ON CONFLICT(UPSERT) ステートメントを使用する必要があります。

  • MaxComputeとHologres間のデータ型マッピングの詳細については、「データ型」をご参照ください。

  • MaxComputeテーブルのデータが更新された後、Hologresにキャッシュされたデータは 10 分以内に更新されます。データをインポートする前に、IMPORT FOREIGN SCHEMA ステートメントを使用して外部テーブルを更新することをお勧めします。

  • MaxComputeからHologresにデータをインポートするには、DataWorksのデータ統合サービスではなく、SQLステートメントを使用することをお勧めします。これは、SQLステートメントを実行することによるデータインポートの方がパフォーマンスが優れているためです。

MaxComputeの非パーティションテーブルからHologresテーブルにデータをインポートしてクエリを実行する

  1. MaxComputeで非パーティションテーブルを作成します。

    MaxComputeで非パーティションテーブルを作成します。MaxComputeの既存の非パーティションテーブルを使用することもできます。

    この例では、public_data という名前のMaxComputeパブリックデータセットの customer テーブルを使用します。MaxComputeコンソールにログインして、データセットをクエリできます。詳細については、「パブリックデータセットリファレンス」をご参照ください。次のサンプルコードは、customerテーブルの作成に使用されるDDLステートメントと、テーブルからデータをクエリするために使用されるSELECTステートメントを示しています。

    -- customerテーブルの作成に使用されるDDLステートメント。
    CREATE TABLE IF NOT EXISTS public_data.customer(
      c_customer_sk BIGINT,
      c_customer_id STRING,
      c_current_cdemo_sk BIGINT,
      c_current_hdemo_sk BIGINT,
      c_current_addr_sk BIGINT,
      c_first_shipto_date_sk BIGINT,
      c_first_sales_date_sk BIGINT,
      c_salutation STRING,
      c_first_name STRING,
      c_last_name STRING,
      c_preferred_cust_flag STRING,
      c_birth_day BIGINT,
      c_birth_month BIGINT,
      c_birth_year BIGINT,
      c_birth_country STRING,
      c_login STRING,
      c_email_address STRING,
      c_last_review_date STRING,
      useless STRING);
    
    -- customerテーブルをクエリするために使用されるSELECTステートメント。
    SELECT * FROM public_data.customer;

    次の図は、customerテーブルのデータの一部を示しています。customer

  2. Hologresで外部テーブルを作成します。

    MaxComputeのソーステーブルにマッピングされたHologresに外部テーブルを作成します。ステートメントの例:

    CREATE FOREIGN TABLE foreign_customer (
        "c_customer_sk" int8,
        "c_customer_id" text,
        "c_current_cdemo_sk" int8,
        "c_current_hdemo_sk" int8,
        "c_current_addr_sk" int8,
        "c_first_shipto_date_sk" int8,
        "c_first_sales_date_sk" int8,
        "c_salutation" text,
        "c_first_name" text,
        "c_last_name" text,
        "c_preferred_cust_flag" text,
        "c_birth_day" int8,
        "c_birth_month" int8,
        "c_birth_year" int8,
        "c_birth_country" text,
        "c_login" text,
        "c_email_address" text,
        "c_last_review_date" text,
        "useless" text
    )
    SERVER odps_server
    OPTIONS (project_name 'public_data', table_name 'customer');

    パラメーター

    説明

    サーバー

    外部テーブルが存在するサーバー。Hologresの基盤レイヤーで作成された odps_server サーバーを使用できます。詳細については、「Postgres FDW」をご参照ください。

    Project_Name

    MaxComputeテーブルが存在するプロジェクトの名前。

    Table_Name

    クエリするMaxComputeテーブルの名前。

    外部テーブルのフィールドのデータ型は、MaxComputeテーブルのデータ型にマッピングする必要があります。データ型マッピングの詳細については、「MaxComputeとHologres間のデータ型マッピング」をご参照ください。

  3. インポートされたデータを格納するためにHologresにテーブルを作成します。

    MaxComputeソーステーブルからインポートされたデータを格納するために、Hologresにテーブルを作成します。

    次のサンプルステートメントは参照用です。テーブルを作成するときは、ビジネス要件に基づいてテーブルスキーマを設定し、適切なインデックスを作成して、より良いクエリパフォーマンスを実現します。テーブルプロパティの詳細については、「CREATE TABLE」をご参照ください。

    -- インポートされたデータを格納するために列指向テーブルを作成します。
    BEGIN;
    CREATE TABLE public.holo_customer (
     "c_customer_sk" int8,
     "c_customer_id" text,
     "c_current_cdemo_sk" int8,
     "c_current_hdemo_sk" int8,
     "c_current_addr_sk" int8,
     "c_first_shipto_date_sk" int8,
     "c_first_sales_date_sk" int8,
     "c_salutation" text,
     "c_first_name" text,
     "c_last_name" text,
     "c_preferred_cust_flag" text,
     "c_birth_day" int8,
     "c_birth_month" int8,
     "c_birth_year" int8,
     "c_birth_country" text,
     "c_login" text,
     "c_email_address" text,
     "c_last_review_date" text,
     "useless" text
    );
    CALL SET_TABLE_PROPERTY('public.holo_customer', 'orientation', 'column');
    CALL SET_TABLE_PROPERTY('public.holo_customer', 'bitmap_columns', 'c_customer_id,c_salutation,c_first_name,c_last_name,c_preferred_cust_flag,c_birth_country,c_login,c_email_address,c_last_review_date,useless');
    CALL SET_TABLE_PROPERTY('public.holo_customer', 'dictionary_encoding_columns', 'c_customer_id:auto,c_salutation:auto,c_first_name:auto,c_last_name:auto,c_preferred_cust_flag:auto,c_birth_country:auto,c_login:auto,c_email_address:auto,c_last_review_date:auto,useless:auto');
    CALL SET_TABLE_PROPERTY('public.holo_customer', 'time_to_live_in_seconds', '3153600000');
    CALL SET_TABLE_PROPERTY('public.holo_customer', 'storage_format', 'segment');
    COMMIT;
  4. Hologresテーブルにデータをインポートします。

    説明

    Hologres V2.1.17以降では、サーバーレスコンピューティング機能がサポートされています。サーバーレスコンピューティング機能は、大量のデータをオフラインでインポートする場合、大規模な抽出、変換、ロード(ETL)ジョブを実行する場合、または外部テーブルから大量のデータをクエリする場合に適しています。サーバーレスコンピューティング機能を使用して、追加のサーバーレスコンピューティングリソースに基づいて前述の操作を実行できます。これにより、インスタンス用に追加のコンピューティングリソースを予約する必要がなくなります。これにより、インスタンスの安定性が向上し、メモリ不足(OOM)エラーの発生が減少します。タスクで使用される追加のサーバーレスコンピューティングリソースに対してのみ課金されます。サーバーレスコンピューティング機能の詳細については、「サーバーレスコンピューティング」をご参照ください。サーバーレスコンピューティング機能の使用方法の詳細については、「サーバーレスコンピューティングのユーザーガイド」をご参照ください。

    INSERT ステートメントを実行して、MaxComputeソーステーブルからHologresテーブルにデータをインポートします。フィールドの一部またはすべてをインポートできます。フィールドの一部をインポートする場合は、INSERTステートメントのフィールドがSELECTステートメントのフィールドと同じ順序で配置されていることを確認してください。ステートメントの例:

    -- 大量のデータをオフラインでインポートし、抽出、変換、ロード(ETL)ジョブを実行するには、サーバーレスコンピューティング機能を使用することをお勧めします。
    SET hg_computing_resource = 'serverless';
    
    -- フィールドの一部をインポートします。
    INSERT INTO holo_customer (c_customer_sk,c_customer_id,c_email_address,c_last_review_date,useless)
    SELECT 
        c_customer_sk,
        c_customer_id,
        c_email_address,
        c_last_review_date,
        useless
    FROM foreign_customer;
    
    -- すべてのフィールドをインポートします。
    INSERT INTO holo_customer
    SELECT * FROM foreign_customer;
    
    -- 設定をリセットします。これにより、後続のSQLステートメントでサーバーレスコンピューティングリソースが使用されなくなります。
    RESET hg_computing_resource;
  5. Hologresのデータをクエリします。

    HologresのMaxComputeソーステーブルからインポートされたデータをクエリします。ステートメントの例:

    SELECT * FROM holo_customer;

MaxComputeのパーティションテーブルからHologresテーブルにデータをインポートしてクエリを実行する

詳細については、「パーティション化されたMaxComputeテーブルからデータをインポートする」をご参照ください。

INSERT OVERWRITEステートメントのベストプラクティス

詳細については、「INSERT OVERWRITE」をご参照ください。

ビジュアライゼーションツールまたは定期スケジュールを使用してデータを同期する

ビジュアライゼーションツールまたは定期スケジュールを使用して、大量のデータを同時にHologresに同期できます。

  • HoloWebを使用してMaxComputeからデータを同期するには、次の手順を実行します。

    1. Holowebコンソール にログインします。詳細については、「HoloWebに接続してクエリを実行する」をご参照ください。

    2. HoloWebコンソールの上部ナビゲーションバーで、メタデータ管理 > Maxcomputeクエリ高速化 > Maxcomputeデータのインポート を選択します。

    3. 表示されるページで、パラメーターを設定します。 一键同步次の表にパラメーターを示します。

      説明

      SQLステートメント セクションでは、ビジュアル化された操作のSQLステートメントが自動的に生成されます。SQLステートメント セクションのSQLステートメントを変更することはできません。ただし、SQLステートメントを他の場所にコピーして変更することはできます。その後、変更したSQLステートメントを実行してデータを同期できます。

      セクション

      パラメーター

      説明

      インスタンス

      インスタンス名

      インスタンスの名前。

      ソースMaxComputeテーブル

      プロジェクト名

      MaxComputeプロジェクトの名前。

      スキーマ名

      MaxComputeテーブルが存在するスキーマの名前。MaxComputeプロジェクトで2層モデルを使用している場合、このパラメーターはデフォルトでは表示されません。MaxComputeプロジェクトで3層モデルを使用している場合は、承認されたスキーマをドロップダウンリストから選択できます。

      テーブル名

      MaxComputeテーブルの名前。プレフィックスベースのあいまい検索がサポートされています。

      デスティネーションHologresテーブル

      データベース名

      内部テーブルが属するHologresデータベースの名前。

      スキーマ名

      Hologresのスキーマの名前。

      デフォルト値は public です。別の承認済みスキーマを選択できます。

      テーブル名

      Hologres内部テーブルの名前。

      ソースMaxComputeテーブルの名前がこのパラメーターに自動的に指定されます。テーブルの名前を変更できます。

      デスティネーションテーブルの説明

      Hologres内部テーブルの説明。カスタムの説明を入力できます。

      パラメーター設定

      GUCパラメーター

      GUCパラメーター。詳細については、「GUCパラメーター」をご参照ください。

      インポートタスク

      フィールド

      MaxComputeテーブルから同期するフィールド。

      MaxComputeテーブルのフィールドの一部またはすべてをインポートできます。

      パーティション設定

      • パーティションフィールド

        パーティションフィールドを選択すると、Hologresはデスティネーションテーブルとしてパーティションテーブルを自動的に作成します。

        Hologresは1レベルのパーティション化をサポートしています。MaxComputeは複数レベルのパーティション化をサポートしています。複数レベルのパーティション化を含むMaxComputeテーブルからパーティション化されたHologresテーブルにデータをインポートする場合は、デスティネーションテーブルのMaxComputeテーブルの第1レベルのパーティションフィールドのみを設定する必要があります。MaxComputeテーブルの他のパーティションフィールドは、デスティネーションテーブルの通常のフィールドにマッピングされます。

      • データタイムスタンプ

        MaxComputeテーブルが日付でパーティション化されている場合は、日付を指定できます。システムは、指定された日付のデータをデスティネーションテーブルに自動的にインポートします。

      プロパティ

      • ストレージモード

        • 列指向ストレージ:このモードは、さまざまな複雑なクエリに適用できます。

        • 行指向ストレージ:このモードは、プライマリキーに基づくポイントクエリとスキャンに適用できます。

        • 行-列ストレージ。このモードは、列指向ストレージと行指向ストレージをサポートするすべてのシナリオに適用できます。このモードは、プライマリキーに基づかないポイントクエリにも適用できます。

        デフォルト値:列指向ストレージ

      • データライフサイクル

        テーブルデータのライフサイクル。このパラメーターを設定しない場合、テーブルデータは永続的に保存されます。

        指定された期間内にデータが更新されない場合、システムは期間の経過後にデータを削除します。

      • バイナリログ

        バイナリロギングを有効にするかどうかを指定します。詳細については、「Hologresバイナリログを購読する」をご参照ください。

      • バイナリログのライフサイクル

        バイナリログの有効期間(TTL)。単位:日。このパラメーターを空のままにすると、TTLはデフォルトで30日(2,592,000秒)になります。

      • 分散列

        フィールドを分散キーとして使用するかどかを指定します。Hologresは、フィールドに基づいて各シャードにデータをシャッフルします。同じ分散キー値を持つデータエントリは、同じシャードに分散されます。分散キーをフィルター条件として使用すると、実行効率を向上させることができます。

      • イベント時間列

        フィールドをセグメントキーとして使用するかどかを指定します。Hologresは、フィールドに基づいてデータをセグメント化します。フィールドがクエリ条件に含まれている場合、Hologresはフィールドに基づいてデータを特定できます。

      • クラスタリングキー

        フィールドをクラスタリングキーとして使用するかどかを指定します。クラスタリングキーのタイプによって、フィールドの順序が決まります。Hologresは、クラスタリングキーを使用して、クラスタリングキーを構成するフィールドに対する範囲クエリとフィルタークエリを高速化できます。

      • 辞書エンコーディング列

        フィールドの値を使用して辞書マッピングを作成するかどかを指定します。辞書エンコーディングは、文字列比較を数値比較に変換して、GROUP BYやFILTERなどのクエリを高速化できます。

        デフォルトでは、TEXT タイプのすべてのフィールドがこのパラメーターに指定されています。

      • ビットマップ列

        フィールドを使用してビットコードを作成するかどかを指定します。フィールドに基づいて、クエリ条件を満たすデータをフィルタリングできます。

        デフォルトでは、TEXT タイプのすべてのフィールドがこのパラメーターに指定されています。

    4. 送信 をクリックします。データがインポートされたら、Hologresで内部テーブルデータをクエリできます。

  • HoloWebは、定期スケジュールを使用した同期をサポートしていません。大量の履歴データを同期する場合、または定期スケジュールを使用してデータをインポートする場合は、DataWorksのDataStudioサービスを使用する必要があります。詳細については、「DataWorksを使用してMaxComputeデータを定期的にインポートする」をご参照ください。

FAQ

MaxComputeからHologresにデータをインポートするときにメモリ不足(OOM)の問題が発生し、返されたエラーメッセージにメモリ制限を超えていると示されている場合があります。ほとんどの場合、"Query executor exceeded total memory limitation xxxxx: yyyy bytes used" というエラーメッセージが報告されます。次のセクションでは、エラーの考えられる原因と解決策について説明します。

  • ステップ 1

    • 考えられる原因:

      INSERTステートメントにSELECTステートメントが含まれていますが、一部のテーブルで ANALYZE ステートメントが実行されていません。考えられるもう1つの原因は、ANALYZE ステートメントが実行されたが、データが更新され、不正確になったことです。その結果、クエリオプティマイザーによって決定された結合順序が無効になり、過剰なメモリオーバーヘッドが発生します。

    • 解決策:

      関係するすべての内部テーブルと外部テーブルで ANALYZE ステートメントを実行して、テーブルの統計メタデータを更新します。これにより、クエリオプティマイザーは最適な実行プランを生成し、OOMの問題を解決できます。

  • ステップ 2

    • 考えられる原因:

      データのインポート元のテーブルに多数の列が含まれており、各行に大量のデータが含まれています。この場合、大量のデータが同時に読み取られます。これにより、過剰なメモリオーバーヘッドが発生します。

    • 解決策:

      INSERTステートメントの前に次のSETコマンドを実行して、一度に読み取るデータ行数を制御します。これにより、OOMの問題が軽減されます。

      set hg_experimental_query_batch_size = 1024;--デフォルト値:8192。
      INSERT INTO holo_table SELECT * FROM mc_table;
  • ステップ 3

    • 考えられる原因:

      データインポートの同時実行性が高いため、大量のCPUリソースが消費され、内部テーブルのクエリに影響します。

    • 解決策:

      V1.1より前のHologresバージョンでは、同時実行性は hg_experimental_foreign_table_executor_max_dop パラメーターによって指定されます。デフォルトの同時実行性は、インスタンスのCPUコア数です。hg_experimental_foreign_table_executor_max_dop パラメーターに小さい値を指定します。これにより、データインポート中のメモリ使用量が削減され、OOMの問題が解決されます。このパラメーターは、外部テーブルで実行されるすべてのジョブに影響します。サンプルコード:

      SET hg_experimental_foreign_table_executor_max_dop = 8;
      INSERT INTO holo_table SELECT * FROM mc_table;
  • ステップ 4

    • 考えられる原因:

      データインポートの同時実行性が高いため、大量のCPUリソースが消費され、内部テーブルのクエリに影響します。

    • 解決策:

      Hologres V1.1では、同時実行性は hg_foreign_table_executor_dml_max_dop パラメーターによって指定されます。デフォルト値は 32 です。hg_foreign_table_executor_dml_max_dop パラメーターに小さい値を指定します。これにより、データのインポートとエクスポートのシナリオにおけるDMLステートメントの同時実行性が低下し、DMLステートメントが過剰なリソースを占有するのを防ぎます。サンプルコード:

      SET hg_foreign_table_executor_dml_max_dop = 8;
      INSERT INTO holo_table SELECT * FROM mc_table;