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

Hologres:パーティション化されたMaxComputeテーブルからのデータのインポート

最終更新日:Jan 11, 2025

このトピックでは、パーティション化されたMaxComputeテーブルからパーティション化されたHologresテーブルにデータをインポートする方法について説明します。

前提条件

  • Hologresインスタンスが購入済みであること。詳細については、「Hologresインスタンスの購入」をご参照ください。

  • MaxComputeがアクティブ化されていること。MaxComputeプロジェクトが作成されていること。 MaxComputeのアクティブ化方法の詳細については、「MaxComputeとDataWorksのアクティブ化」をご参照ください。

  • DataWorksがアクティブ化されていること。DataWorksワークスペースが作成されていること。 DataWorksワークスペースの作成方法の詳細については、「ワークスペースの作成」をご参照ください。

背景情報

Hologresの外部テーブルは、MaxComputeからHologresにデータをインポートするために広く使用されています。データのインポートは、日常業務で頻繁に必要になります。この場合、DataWorksの強力なスケジューリング機能とジョブオーケストレーション機能を使用して、定期的なスケジューリングを実装し、自動トリガーワークフローを設定してデータをインポートできます。詳細については、「DataWorksワークフローのサンプル」をご参照ください。

ワークフローは複雑です。そのため、DataWorksのMigration Assistantサービスを使用して、サンプルDataWorksワークフローのパッケージをワークスペースにインポートし、ワークフローを作成できます。その後、ビジネス要件に基づいて一部のパラメーターまたはスクリプトを変更できます。詳細については、「Migration Assistantサービスを使用してDataWorksワークフローをインポートする」をご参照ください。

注意事項

  • 一時テーブルは、操作の原子性を確保するために使用されます。一時テーブルは、テーブルデータがインポートされた後にのみ、パーティションテーブルにアタッチされます。この場合、データのインポートに失敗した場合、テーブルを削除する必要はありません。

  • 既存の子パーティションテーブルのデータを更新するシナリオでは、子パーティションテーブルの削除と一時テーブルのアタッチをトランザクションに配置して、トランザクションの原子性、一貫性、分離性、耐久性(ACID)プロパティを確保する必要があります。

  • Migration Assistantサービスを使用してDataWorksワークフローをインポートするための前提条件:

手順

  1. MaxComputeデータを準備します。

    1. MaxComputeコンソールにログインします。

    2. 左側のナビゲーションペインで、[dataworks] > [データ分析] を選択します。

    3. [SQLクエリ] ページで、次のSQLステートメントを入力し、[実行] アイコンをクリックして、パーティションテーブルを作成します。

      DROP TABLE IF EXISTS odps_sale_detail;
      
      -- odps_sale_detail という名前のパーティションテーブルを作成します。
      CREATE TABLE IF NOT EXISTS odps_sale_detail 
      (
          shop_name STRING
          ,customer_id STRING
          ,total_price DOUBLE
      )
      PARTITIONED BY 
      (
          sale_date STRING
      )
      ;
    4. [SQLクエリ] ページで、次のSQLステートメントを入力し、[実行] アイコンをクリックして、パーティションテーブルにデータをインポートします。

      -- パーティションテーブルに 20210815 パーティションを作成します。
      ALTER TABLE odps_sale_detail ADD IF NOT EXISTS PARTITION(sale_date='20210815')
      ;
      
      -- 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')
      ;
      
      -- 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')
      ;
      
      -- 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')
      ;
      
      -- 20210818 パーティションにデータをインポートします。
      INSERT OVERWRITE TABLE odps_sale_detail PARTITION(sale_date='20210818') VALUES 
      ('s1','c1',100.1),
      ('s2','c2',100.2),
      ('s3','c3',100.3)
      ;
  2. Hologresにテーブルを作成します。

    • 外部テーブルを作成します。

      1. データベースにログインします。

        1. HoloWebコンソールで、上部ナビゲーションバーの [メタデータ管理] をクリックします。

        2. [メタデータ管理] タブで、左側のナビゲーションペインで作成したデータベースを見つけ、データベース名をダブルクリックします。表示されるダイアログボックスで、[OK] をクリックします。登录数据库

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

        1. [SQLエディター] タブの左上隅にある image アイコンをクリックします。

        2. [アドホッククエリ] タブで、[インスタンス] ドロップダウンリストからインスタンスを選択し、[データベース] ドロップダウンリストからデータベースを選択し、SQLエディターに次のサンプルステートメントを入力して、[実行] をクリックします。

          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');
    • 内部パーティションテーブルを作成します。

      1. データベースにログインします。

        1. HoloWebコンソールで、上部ナビゲーションバーの [メタデータ管理] をクリックします。

        2. [メタデータ管理] タブで、左側のナビゲーションペインで作成したデータベースを見つけ、データベース名をダブルクリックします。表示されるダイアログボックスで、[OK] をクリックします。登录数据库

      2. パーティションテーブルを作成します。

        1. [SQLエディター] タブの左上隅にある image アイコンをクリックします。

        2. [アドホッククエリ] タブで、[インスタンス] ドロップダウンリストからインスタンスを選択し、[データベース] ドロップダウンリストからデータベースを選択し、SQLエディターに次のサンプルステートメントを入力して、[実行] をクリックします。

          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;
  3. パーティションからHologres一時テーブルにデータをインポートします。

    [アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。

    次の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;
  4. 一時テーブルをパーティション化されたHologresテーブルにアタッチします。

    [アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。

    • 特定のパーティションに対応する子テーブルが存在する場合は、一時テーブルを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;
      
      -- 一時テーブルをパーティション化されたHologresテーブルにアタッチします。
      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;
      -- 一時テーブルをパーティション化されたHologresテーブルにアタッチします。
      ALTER TABLE holo_sale_detail ATTACH PARTITION holo_sale_detail_20210816
      FOR VALUES IN ('20210816');
      COMMIT ;
  5. パーティション化されたHologresテーブルの統計を収集します。

    [アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。

    次のSQLステートメントは、パーティションテーブル holo_sale_detail の統計を収集し、パーティションテーブルの実行計画を確認するために使用されます。親パーティションテーブルの統計のみを収集する必要があります。

    -- 大量のデータがインポートされた後、親パーティションテーブルの統計を収集します。
    ANALYZE holo_sale_detail;
  6. オプション。期限切れのパーティションに対応する子パーティションテーブルを削除します。

    本番環境では、データには有効期限(TTL)があります。期限切れのパーティションに対応する子パーティションテーブルを削除する必要があります。

    [アドホッククエリ] タブで、SQLエディターに次のサンプルステートメントを入力し、[実行] をクリックします。

    次のSQLステートメントは、 20210631 パーティションに対応する子パーティションテーブルを削除するために使用されます。

    DROP TABLE IF EXISTS holo_sale_detail_20210631;

DataWorksワークフローのサンプル

日常業務では、前述のSQLステートメントを定期的に実行する必要があります。この場合、DataWorksの強力なスケジューリング機能とジョブオーケストレーション機能を使用して、定期的なスケジューリングを実装し、自動トリガーワークフローを設定してデータをインポートできます。次の内容は、Migration Assistantサービスを使用してDataWorksワークフローをインポートする際に、ビジネス要件に基づいて一部のパラメーターまたはスクリプトを変更するのに役立ちます。

ワークフロー内のノード

  • 基本パラメーター

    基本パラメーターは、ワークフロー全体で使用されるすべてのパラメーターを管理するために使用されます。次の表は、基本パラメーターについて説明しています。

    番号

    パラメーター

    タイプ

    有効な値

    説明

    1

    datepre31

    変数

    ${yyyymmdd-31}

    期限切れのパーティションに対応する子パーティションテーブルを削除するための条件。 ${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 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;

    基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。写入分区数据至临时表

  • 特定のパーティションに対応する子パーティションテーブルを置き換えます。

    これは、パーティションに対応する子パーティションテーブルが存在する場合にデータを更新するために使用されるHologres SQLノードです。子パーティションテーブルの置き換えをトランザクションに配置して、トランザクションのACIDプロパティを確保します。ノードには、次のSQLステートメントが含まれています。

    -- 特定のパーティションに対応する子パーティションテーブルが存在する場合は、子パーティションテーブルを置き換えます。
    BEGIN ;
    
    -- 既存の子パーティションテーブルを削除します。
    DROP TABLE IF EXISTS ${holo_table_name}_${datetime1};
    
    -- 一時テーブルの名前を変更します。
    ALTER TABLE ${holo_table_name}_tmp_${datetime1} RENAME TO ${holo_table_name}_${datetime1};
    
    -- 一時テーブルをパーティション化されたHologresテーブルにアタッチします。
    ALTER TABLE ${holo_table_name} ATTACH PARTITION ${holo_table_name}_${datetime1}
    FOR VALUES IN ('${datetime1}');
    
    COMMIT ;

    基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。替换子表

  • パーティションテーブルの統計を収集します。

    これは、親パーティションテーブルの統計を収集するために使用されるHologres SQLノードです。ノードには、次のSQLステートメントが含まれています。

    -- 大量のデータがインポートされた後、親パーティションテーブルの統計を収集します。
    ANALYZE ${holo_table_name};

    基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。收集分区表的统计信息

  • 期限切れのパーティションに対応する子パーティションテーブルを削除します。

    本番環境では、データにはTTLがあります。期限切れのパーティションに対応する子パーティションテーブルを削除する必要があります。

    たとえば、Hologresに過去 31 日間に生成されたパーティションに対応する子パーティションテーブルのみを保存する場合、datepre31 パラメーターは ${yyyymmdd-31} に設定されます。この場合、期限切れのパーティションに対応する子パーティションテーブルを削除するために使用されるノードには、次のSQLステートメントが含まれています。

    -- 期限切れのパーティションに対応する子パーティションテーブルを削除します。
    
    BEGIN ;
    
    DROP TABLE IF EXISTS ${holo_table_name}_${datepre31};
    
    COMMIT ;

    ワークフローの実行時に、bizdateパラメーターの値が 20200309 の場合、datepre31パラメーターの値は 20200207 になります。この場合、2020年 2 月 7 日より前に生成されたパーティションに対応する子パーティションテーブルが削除されます。

    基本パラメーターをこのノードの祖先ノードに関連付けて、基本パラメーターの変数を制御します。次の図は、システム構成を示しています。清理过期子表

Migration Assistantサービスを使用してDataWorksワークフローをインポートする

  • 前述のDataWorksワークフローは複雑です。そのため、DataWorksのMigration Assistantサービスを使用して、サンプルDataWorksワークフローのパッケージをプロジェクトにインポートし、サンプルDataWorksワークフローを取得できます。その後、ビジネス要件に基づいて一部のパラメーターまたはスクリプトを変更できます。

  • 次の手順を実行する前に、サンプルDataWorksワークフローのパッケージをダウンロードしてください。

  1. DataWorksのMigration Assistantホームページに移動します。詳細については、「Migration Assistantページに移動する」をご参照ください。

  2. Migration Assistantページの左側のナビゲーションペインで、[dataworks内での移行] > [dataworksインポート] を選択します。

  3. [dataworksインポート] ページの右上隅にある [インポートタスクの作成] をクリックします。

  4. [インポートタスクの作成] ダイアログボックスで、パラメーターを設定します。

    新建导入任务

    パラメーター

    説明

    [名前]

    カスタム名を指定します。名前には、文字、数字、アンダースコア(_)、ピリオド(.)を含めることができます。

    [アップロード元]

    アップロードするパッケージのソース。

    • [ローカル]: パッケージのサイズが 30 MB 以下の場合、コンピューターからDataWorksワークスペースにパッケージをアップロードします。

    • [OSS]: パッケージのサイズが 30 MB を超える場合、パッケージをオブジェクトストレージサービス(OSS)にアップロードし、パッケージのOSS URLを指定します。OSSコンソールの View Details パネルでパッケージのOSS URLをコピーし、取得したOSS URLを指定してパッケージをDataWorksワークスペースにアップロードできます。OSSへのオブジェクトのアップロード方法の詳細については、「オブジェクトのアップロード」をご参照ください。オブジェクトのOSS URLの取得方法の詳細については、「オブジェクトの共有」をご参照ください。下载链接

    [備考]

    インポートタスクの説明。

  5. [OK] をクリックします。[インポートタスクの設定] ページで、マッピングを設定します。

  6. 右上隅にある [インポート] をクリックします。[確認] メッセージで、[OK] をクリックします。

    1. パッケージがインポートされると、前述の自動トリガーワークフローがDataStudioに表示されます。

    2. 関連するDDLステートメントが、手動でトリガーされたワークフローに表示されます。