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

MaxCompute:Hologres 外部テーブル

最終更新日:Jan 14, 2026

このトピックでは、`CREATE EXTERNAL TABLE` ステートメントを使用して Hologres 外部テーブルを作成する方法について説明します。Hologres データソース、STS 認証情報、デュアル署名モード、マッピング先のテーブル、Java Database Connectivity (JDBC) ドライバー情報などの詳細を指定する方法を解説します。

機能紹介

Hologres は、PostgreSQL プロトコルと互換性があり、MaxCompute とシームレスに統合されたリアルタイムのインタラクティブ分析データウェアハウスです。MaxCompute で Hologres 外部テーブルを作成することで、PostgreSQL JDBC ドライバーと STS 認証情報 を使用して Hologres データソースからデータをクエリできます。この方法では、冗長なストレージやデータのインポート/エクスポートなしで直接データをクエリできるため、クエリ結果を迅速に取得できます。

適用範囲

  • データ操作 (DML)

    • MaxCompute は Hologres 外部テーブルに対する `UPDATE` または `DELETE` 操作をサポートしていません。

    • `INSERT OVERWRITE` 操作は Hologres 外部テーブルではサポートされていません。

      MaxCompute のデータで Hologres のデータを上書きするには、Hologres の `INSERT OVERWRITE` セマンティクスを使用できます。Hologres から、MaxCompute テーブルにマッピングされた外部テーブルを読み取ることができます。詳細については、「INSERT OVERWRITE」をご参照ください。

  • データ書き込みのリスク

    Hologres 外部テーブルに大量のデータを書き込む場合、複数のプロセスが並行してデータを書き込みます。まれに、書き込みプロセスがデータを再書き込みし、データの重複を引き起こす可能性があります。

  • パーティション

    Hologres のパーティションテーブルは、MaxCompute のパーティションテーブルに直接マッピングされません。Hologres 外部テーブルはパーティションをサポートしていません。ただし、直接読み取りモードを使用して、Hologres のパーティション化された親テーブルにマッピングされた MaxCompute 外部テーブルをクエリする場合、クエリ条件に子テーブルのパーティションキー列が含まれていると、パーティションプルーニングがトリガーされることがあります。

  • Hologres 外部テーブルはクラスタープロパティをサポートしていません。

  • Hologres 外部テーブルは Hologres の動的テーブルにマッピングできません。

サポートされているデータ型

  • DECIMAL 型の制限:

    MaxCompute で作成された Hologres 外部テーブルでは、DECIMAL データ型はデフォルトで decimal(38,18) に固定されており、変更できません。ソーステーブルの精度が低い場合は、MaxCompute 外部テーブルで列を STRING 型として定義できます。その後、CAST 関数を使用して、列をクエリする際に型を変換できます。

  • 複雑なデータ型の制限:

    MaxCompute で作成された Hologres 外部テーブルは、ArrayMapStruct などの複雑なデータ型をサポートしていません。

  • その他の互換性のない型:

    Hologres の MONEY などのデータ型は、MaxCompute に対応するデータ型がなく、サポートされていません。

以下の表に詳細を示します

Hologres データ型

MaxCompute データ型

JDBC 読み取り

JDBC 書き込み

直接読み取り (odps.table.api.enable.holo.table=true)

説明

INTEGER (エイリアス: INT または INT4)

INT

有効化済み

有効化済み

有効化済み

32 ビット符号付き整数。

TEXT

STRING, VARCHAR

開通済み

開通済み

有効

文字列型。現在の長さ制限は 8 MB です。

SMALLINT

SMALLINT

有効化済み

有効

有効

16 ビット符号付き整数。

INT2

SMALLINT

有効

有効化済み

有効化済み

16 ビット符号付き整数。

BIGINT (エイリアス: INT8)

BIGINT

開通済み

有効化済み

有効

64 ビット符号付き整数。

BYTEA

BINARY

有効

有効

有効

バイナリデータ型。現在の長さ制限は 8 MB です。Hologres の BINARY 型の最大サイズは 1 GB です。

REAL (エイリアス: FLOAT4)

FLOAT

有効

開通済み

有効

32 ビットバイナリ浮動小数点型。

DOUBLE PRECISION (エイリアス: FLOAT8)

DOUBLE

有効化済み

有効化済み

有効

64 ビットバイナリ浮動小数点型。

BOOLEAN (エイリアス: BOOL)

BOOLEAN

有効

開通済み

開通済み

BOOLEAN 型。

TIMESTAMP

TIMESTAMP_NTZ

有効

未開通

開通済み

ストレージの精度はナノ秒です。タイムゾーンエラーが発生する可能性があります。

Hologres の TIMESTAMP 型にはタイムゾーンが含まれず、マイクロ秒のストレージ精度を持ちます。

TIMESTAMP WITH TIME ZONE (エイリアス: TIMESTAMPTZ)

TIMESTAMP

有効化済み

未開通

有効

ナノ秒精度のタイムスタンプ型。フォーマットは yyyy-mm-dd hh:mm:ss.xxxxxxxxx です。

MaxCompute と Hologres は、基盤レイヤーで精度の変換を実行します。MaxCompute の出力にはタイムゾーン形式は含まれません。

DECIMAL (エイリアス: NUMERIC)

DECIMAL(precision,scale)

開通済み

有効

有効

10 進数の正確な数値型。

  • precision:表現できる最大桁数を示します。有効値:1 <= precision <= 38

  • scale:小数部の桁数を示します。デフォルトの有効値:0 <= scale <= 18

MaxCompute で DECIMAL 型の精度を指定しない場合、デフォルトは (38,18) です。IMPORT FOREIGN SCHEMA ステートメントを使用してテーブルを作成すると、システムが自動的に精度を変換します。

CHAR(n)

CHAR(n)

有効化済み

有効

有効化済み

MaxCompute では、CHAR(n) は固定長の文字型で、n は長さです。n の最大値は 255 です。長さが不足している場合は、スペースで埋められます。

Hologres の CHAR(n) の最大サイズは 1 GB です。

VARCHAR(n)

VARCHAR(n)

有効化済み

有効化済み

開通済み

MaxCompute では、VARCHAR(n) は可変長の文字型で、n は長さです。n の値の範囲は 1 から 65535 です。

Hologres の VARCHAR(n) の最大サイズは 1 GB です。

DATE

DATE

有効化済み

有効

有効化済み

日付型。フォーマットは yyyy-mm-dd です。

INT4[]

ARRAY<INT>

有効化済み

未開通

有効

複雑なデータ型 ARRAY。

INT8[]

ARRAY<BIGINT>

有効

未開通

開通済み

FLOAT4[]

ARRAY<FLOAT>

有効化済み

未開通

有効

FLOAT8[]

ARRAY<DOUBLE>

有効

未開通

有効

BOOLEAN[]

ARRAY<BOOLEAN>

有効

未開通

有効

TEXT[]

ARRAY<STRING>

有効化済み

未開通

有効化済み

JSONB

JSON

未開通

未開通

有効

複雑なデータ型 JSON。直接読み取りモードでサポートされています。

JSON

STRING

有効

未開通

未開通

文字列型。現在の長さ制限は 8 MB です。JDBC モードは Hologres の JSON 型をサポートしています。

SERIAL (自動増分シーケンス)

INT

開通済み

無効

開通済み

Hologres の自動増分シーケンスフィールドについては、MaxCompute の INT 型を使用してデータを受け取ることができます。ただし、データ書き込み時には自動増分機能は利用できません。

RoaringBitmap

サポートされていません

未開通

未開通

未開通

MaxCompute に対応する型はありません。

RoaringBitmap64

サポートされていません

未開通

未開通

未开通

MaxCompute に対応する型はありません。

BIT(n)

サポートされていません

未開通

未開通

未開通

MaxCompute に対応する型はありません。

VARBIT(n)

サポートされていません

未開通

未開通

未開通

MaxCompute に対応する型はありません。

INTERVAL

サポートされていません

未開通

未開通

未開通

MaxCompute に対応する型はありません。

TIMETZ

サポートされていません

未開通

無効

未開通

MaxCompute に対応する型はありません。

TIME

サポートされていません

未開通

無効

未開通

MaxCompute に対応する型はありません。

INET

サポートされていません

未開通

未開通

未開通

MaxCompute に対応する型はありません。

MONEY

サポートされていません

無効

未開通

未開通

MaxCompute に対応する型はありません。

OID

サポートされていません

未有効化

未開通

未開通

MaxCompute に対応する型はありません。

UUID

サポートされていません

未有効化

未開通

未開通

MaxCompute に対応する型はありません。

Hologres 外部テーブルの作成

Hologres 外部テーブルは、STS モードまたはデュアル署名モードで作成できます。

注意事項

外部テーブル作成の仕様

  • Hologres の IP アドレスホワイトリスト機能を有効にする場合は、Hologres 外部テーブルをデュアル署名モードで作成してください。STS モードでテーブルを作成すると、MaxCompute から Hologres へのアクセスが IP アドレスホワイトリストによってブロックされます。

  • `CREATE EXTERNAL TABLE` ステートメントでテーブル名を指定することで、Hologres の親テーブルと子テーブルの両方を MaxCompute 外部テーブルにマッピングできます。ただし、親テーブルは読み取り専用です。

  • Hologres 外部テーブルにデータを書き込む際、Hologres の INSERT ON CONFLICT (UPSERT) メカニズムはサポートされていません。Hologres ソーステーブルにプライマリキーがある場合は、書き込むデータがソーステーブルのプライマリキーと競合しないようにしてください。

  • テーブル名とフィールド名では大文字と小文字が区別されません。テーブルやフィールドを作成またはクエリする際に、大文字と小文字の変換を強制することはできません。

スキーマの互換性

Hologres ソーステーブルのスキーマが外部テーブルのスキーマと一致しない場合:

  • 列数が一致しない場合:Hologres ソーステーブルの列数が外部テーブル DDL より少ない場合、Hologres テーブルからデータを読み取る際にエラーが報告されます。例:column "xxx" does not exist。Hologres ソーステーブルの列数が外部テーブル DDL より多い場合、余分な列は無視されます。

  • 列の型が一致しない場合:MaxCompute は、Hologres ソーステーブルの STRING 列に INT 型をマッピングすることをサポートしていません。STRING 型を使用して INT 列にマッピングすることは可能ですが、推奨されません。

構文

外部テーブルを作成する際には、`CREATE EXTERNAL TABLE` DDL ステートメントで StorageHandler を指定する必要があります。また、STS 認証情報 (またはデュアル署名モード) と Hologres データソースの JDBC エンドポイントを設定する必要があります。

Hologres 外部テーブルを STS モードで作成

サンプルコードについては、「Hologres 外部テーブルの作成 (STS モード)」をご参照ください。

CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
  'odps.properties.rolearn'='<ram_arn>')
location '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
  'odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);

Hologres 外部テーブルをデュアル署名モードで作成

サンプルコードについては、「Hologres 外部テーブルの作成 (デュアル署名モード)」をご参照ください。

デュアル署名の Hologres 外部テーブルを使用すると、同じ RAM ユーザーが手動での権限付与なしに MaxCompute と Hologres の権限のあるテーブルにアクセスできます。このモードは Hologres の IP アドレスホワイトリスト機能もサポートしており、セキュリティ設定を簡素化します。

-- デュアル署名スイッチを有効にします。
SET odps.sql.common.table.planner.ext.hive.bridge=true;
-- 外部テーブルを作成します。
CREATE EXTERNAL TABLE [IF NOT EXISTS]  <table_name>(
  <col1_name> <data_type>,
  <col2_name> <data_type>,
  ......
)
STORED BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>'
LOCATION '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>' 
tblproperties (
  'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 
  'odps.federation.jdbc.target.db.type'='holo',
  ['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);

パラメーター

パラメーター

必須

説明

odps.sql.common.table.planner.ext.hive.bridge

はい

Hologres 外部テーブルをデュアル署名モードで作成するかどうかを指定します。値を true に設定して、デュアル署名スイッチを有効にします。

いいえ

Hologres 外部テーブルを STS モードで作成する場合、このパラメーターを指定する必要はありません。

IF NOT EXISTS

いいえ

  • IF NOT EXISTS オプションを指定せず、同じ名前のテーブルが存在する場合、エラーが報告されます。

  • IF NOT EXISTS を指定すると、同じ名前のテーブルが存在するかどうかに関わらず、ステートメントは正常に実行されます。既存のテーブルのスキーマが作成しようとしているテーブルのスキーマと異なる場合でも、既存のテーブルのメタデータは変更されません。

table_name

はい

MaxCompute で作成する Hologres 外部テーブルの名前。

col_name

はい

Hologres 外部テーブルの列の名前。

data_type

はい

Hologres 外部テーブルの列のデータ型。

STORED BY

はい

Hologres 外部テーブルのクエリ方法を定義する StorageHandler を指定します。

値は com.aliyun.odps.jdbc.JdbcStorageHandler に固定されており、JDBC 接続方式が使用されることを示します。

ram_arn

はい

Hologres 外部テーブルを STS モードで作成する場合に必須です。外部テーブル作成時の STS 認証用の RAM ロールの ARN を指定します。

  1. Resource Access Management (RAM) コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール]を選択します。

  3. [ロール] ページで、対象の [ロール名] をクリックして詳細ページを開きます。

  4. [基本情報] セクションで、[Amazon リソースネーム (ARN)] を確認できます。

いいえ

Hologres 外部テーブルをデュアル署名モードで作成する場合、このパラメーターを指定する必要はありません。

LOCATION

はい

Hologres インスタンスの JDBC エンドポイント。以下のパラメーターが含まれます:

  • endpoint:必須。Hologres インスタンスのクラシックネットワークドメイン名

    重要

    クラシックネットワーク経由のアクセスのみがサポートされています。VPC 経由のアクセスはサポートされていません。

  • port:必須。Hologres インスタンスのネットワークポート

    1. Hologres 管理コンソールにログインし、左上のコーナーでリージョンを選択します。

    2. 左側のナビゲーションウィンドウで、[インスタンス]を選択します。

      [インスタンス] ページで、対象のインスタンス名をクリックします。

  • database:必須。接続先の Hologres データベースの名前。Hologres データベースの詳細については、「CREATE DATABASE」をご参照ください。

  • ApplicationName:必須。デフォルト値は MaxCompute です。この値を変更する必要はありません。

  • schema:オプション。テーブル名が Hologres データベース内で一意である場合、またはソーステーブルがデフォルトのスキーマにある場合は、このプロパティを設定する必要はありません。スキーマの詳細については、「CREATE SCHEMA」をご参照ください。

  • holo_table_name:必須。Hologres ソーステーブルの名前。Hologres ソーステーブルの詳細については、「CREATE TABLE」をご参照ください。

tblproperties

はい

  • mcfed.mapreduce.jdbc.driver.class:必須。

    Hologres データベースに接続するためのドライバーを指定します。値は org.postgresql.Driver に固定されています。

  • odps.federation.jdbc.target.db.type:必須。

    接続するデータベースのタイプを指定します。値は holo に固定されています。

  • odps.federation.jdbc.colmapping:オプション。

    指定したデータソースの一部の列を Hologres 外部テーブルにマッピングするには、このパラメーターを設定して、Hologres ソーステーブルのフィールドと Hologres 外部テーブルのフィールド間のマッピングを指定します。

    • このパラメーターが設定されていない場合、ソーステーブルのフィールドは Hologres 外部テーブルの同じ名前の列にマッピングされます。

    • このパラメーターを設定し、Hologres 外部テーブルの一部の列のマッピングのみを指定した場合、ソーステーブルのフィールドは Hologres 外部テーブルの同じ名前の列にマッピングされます。他の指定されていない列については、列名または型が一致しない場合にエラーが報告されます。

    • このパラメーターを設定し、Hologres のフィールド名に大文字が含まれている場合は、Hologres のフィールド名を二重引用符 ("") で囲みます。フォーマット:MaxCompute field1 : "Hologres field1"[ ,MaxCompute field2 : "Hologres field2" ,...]

      説明

      Hologres ソーステーブルのフィールドは c bool, map_B string, a bigint です。Hologres 外部テーブルのフィールドは a bigint, x string, c bool です。

      colmapping'x: "map_B"' に設定すると、マッピングは成功し、Hologres データをクエリできます。

  • mcfed.mapreduce.jdbc.input.query:オプション。

    Hologres ソーステーブルからデータを読み取ります。外部テーブルの列と列名は、直接クエリされる Hologres ソーステーブルの列、列名、およびデータ型と同じでなければなりません。エイリアスを使用する場合、名前はエイリアスと一致している必要があります。select_sentence のフォーマットは SELECT xxx FROM <holo_database_name>.<holo_schema_name>.<holo_table_name> です。

データの準備

すでに Hologres データベース、Hologres テーブル、およびテストデータがある場合は、このステップをスキップできます。

Hologres データベースの作成

  1. Hologres 管理コンソールにログインし、左上のコーナーでリージョンを選択します。

  2. 左側のナビゲーションウィンドウで、[インスタンス]を選択します。

  3. インスタンスがない場合は、まず Hologres インスタンスを購入する必要があります。

    [インスタンス] ページで、対象のインスタンス名をクリックします。

  4. インスタンス詳細ページで、[インスタンスに接続] をクリックします。

  5. 上部にある[メタデータ管理]タブをクリックします。

    データベースの作成をクリックします。表示されるダイアログボックスで、データベース名を入力し、他のパラメーターはデフォルト設定のままにします。

Hologres テーブルの作成

  1. インスタンス詳細ページで、[インスタンスに接続] をクリックします。

  2. 上部にある [SQL Editor] タブをクリックします。

  3. 次のステートメントを入力します:

    CREATE TABLE IF NOT EXISTS holo (
        id   INT PRIMARY KEY,
        name TEXT
    );
    
    INSERT INTO holo (id, name) VALUES
        (1, 'kate'),
        (2, 'mary'),
        (3, 'bob'),
        (4, 'tom'),
        (5, 'lulu'),
        (6, 'mark'),
        (7, 'haward'),
        (8, 'lilei'),
        (9, 'hanmeimei'),
        (10, 'lily'),
        (11, 'lucy');
    
    SELECT * FROM holo ORDER BY id;

Hologres 外部テーブルの作成 (STS モード)

前提条件

  1. MaxCompute クライアントがインストールされ、設定済みであること

  2. Hologres 外部テーブルを作成するための宛先 MaxCompute プロジェクトが利用可能であること。

    MaxCompute プロジェクトの作成方法については、「MaxCompute プロジェクトの作成」をご参照ください。

RAM ロールの作成と権限付与

説明

Hologres は、異なる Alibaba Cloud アカウントの RAM ロールをデータベースインスタンスに追加することをサポートしていません。したがって、STS モードでは、Hologres は同じアカウントに属する RAM ロールのみの権限付与をサポートします。

同様に、MaxCompute が Hologres 外部テーブルまたは外部スキーマにアクセスする場合、同じアカウントの RAM ロールのみがサポートされます。

  1. RAM ロールの作成

    RAM ロールを作成して、その ARN を取得します。ARN は、外部テーブルを作成する際の STS 認証に使用されます。必要に応じて、RAM ロールの信頼できるエンティティタイプを選択します。この例では、信頼できるエンティティは Alibaba Cloud アカウントです。

    • Alibaba Cloud アカウント:Alibaba Cloud アカウント配下の RAM ユーザーは、RAM ロールを偽装してクラウドリソースにアクセスできます。詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。

    • ID プロバイダー:オンプレミスの ID システムから Alibaba Cloud 管理コンソールにログインするためのシングルサインオン (SSO) を設定できます。これは、統一されたユーザーログイン認証を必要とする企業に役立ちます。詳細については、「信頼できる IdP の RAM ロールを作成する」をご参照ください。

    次のステップを実行します:

    1. Resource Access Management (RAM) コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。

    3. [ロール] ページで、[ロールの作成] をクリックします。

    4. [ロールの作成] ページで、[プリンシパルタイプ][クラウドアカウント] に設定します。

  2. 信頼ポリシーの変更

    1. [ロール] ページで、対象の [ロール名] をクリックすると、その詳細ページが開きます。

    2. [信頼ポリシー] タブで、[信頼ポリシーの編集] をクリックします。[信頼ポリシーの編集] ページで、[JSON] タブをクリックします。

    3. 次の内容で信頼ポリシーを変更します。

      次の内容に基づいて信頼ポリシーを変更します。信頼ポリシーの設定は、選択した信頼できるエンティティのタイプによって異なります。ポリシー内の <UID> は Alibaba Cloud アカウント ID であり、ユーザー情報ページで確認できます。

      信頼できるエンティティタイプが Alibaba Cloud アカウントの場合

      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::<UID>:root"
              ]
            }
          },
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "Service": [
                "<UID>@odps.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
      }

      信頼できるエンティティタイプが ID プロバイダーの場合

      {
        "Statement": [
              {
                  "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "saml:recipient": "https://signin.aliyun.com/saml-role/sso"
                      }
                  },
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": [
                          "acs:ram::<UID>:saml-provider/IDP"
                      ]
                  }
              },
              {
                  "Action": "sts:AssumeRole",
                  "Effect": "Allow",
                  "Principal": {
                      "Service": [
                          "<UID>@odps.aliyuncs.com"
                      ]
                  }
              }
          ],
          "Version": "1"
      }
  3. RAM ロールを Hologres インスタンスに追加し、権限を付与する

    RAM ロールには、Hologres インスタンスに対する開発者権限が必要です。デフォルトでは、RAM ロールは Hologres コンソールでインスタンスを表示または操作できません。そのため、Alibaba Cloud アカウントが RAM ロールに必要な権限を付与する必要があります。次のいずれかの方法で、RAM ロールを Hologres インスタンスに追加し、権限を付与できます:

    Hologres コンソールで権限を付与する

    1. Hologres 管理コンソールにログインし、左上のコーナーでリージョンを選択します。

    2. 左側のナビゲーションウィンドウで、[インスタンス]を選択します。

    3. [インスタンス] ページで、対象のインスタンス名をクリックします。

    4. インスタンス詳細ページで、[インスタンスに接続] をクリックします。

    5. 上の [セキュリティセンター] タブをクリックします。

      左側のナビゲーションウィンドウで、[ユーザー管理]を選択します。

    6. [データベース権限付与] タブで、インスタンスの RAM ロールに開発者権限を付与します。

      データベースのアクセスポリシーがエキスパートモードに設定されている場合は、ユーザー管理ページでロールタイプを SuperUser に変更する必要があります。この変更後、データベース権限を個別に付与する必要はありません。

    RAM コンソールで権限を付与する

    RAM ユーザーが RAM ロールを偽装する場合、デフォルトでは RAM ユーザーは Hologres コンソールに対する権限を持ちません。Alibaba Cloud アカウントは、RAM コンソールで RAM ユーザーに AliyunRAMReadOnlyAccess 権限を付与する必要があります。そうしないと、RAM ユーザーは Hologres コンソールでいかなる操作も実行できません。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。

    1. Resource Access Management (RAM) コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール]を選択します。

    3. [ロール] ページで、対象の [ロール名][アクション] 列にある [権限の付与] をクリックします。

    4. AliyunRAMReadOnlyAccess ポリシーを選択して、現在のロールに権限を付与します。

    SQL ステートメントを使用して権限を付与する

    SQL ステートメントを使用して権限を付与する方法については、「Hologres 権限モデル」をご参照ください。

MaxCompute で外部テーブルを作成する

  1. MaxCompute クライアントにログインし、宛先の MaxCompute プロジェクトに切り替えます。

  2. 次のコマンドを実行して、Hologres 外部テーブルを作成します。

    データの準備」ステップで準備した Hologres インスタンス情報は次のとおりです:

    • Hologres データベース名:holo_external_test

    • Hologres データベーススキーマ:public

    • Hologres テーブル名:holo

    • Hologres データベースのクラシックネットワークエンドポイント:hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80

    CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc
    (
     id bigint,
     name string
    )
    stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' 
    WITH serdeproperties (
      'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>')
    location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute&currentSchema=public&useSSL=true&table=<table name>/'
    tblproperties (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
      'odps.federation.jdbc.colmapping'='id:id,name:name'
    );
  3. 次のコマンドを実行して、新しく作成した Hologres 外部テーブルを使用して Hologres ソーステーブル情報をクエリします。

    -- Hologres 外部テーブルにアクセスするために、次のプロパティを追加します。
    SET odps.sql.split.hive.bridge=true;
    SET odps.sql.hive.compatible=true;
    SET odps.table.api.enable.holo.table=true; -- JDBC 直接読み取りモードを有効にします。
    -- Hologres 外部テーブルからデータをクエリします。
    SELECT * FROM my_table_holo_jdbc limit 10;
    -- 次の結果が返されます。
    +------------+------------+
    | id         | name       | 
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 6          | mark       | 
    | 11         | lucy       | 
    +------------+------------+
  4. Hologres 外部テーブルを使用して、Hologres とのデータ交換および共同分析を実行します。

    • MaxCompute で処理されたデータを外部テーブルを使用して Hologres に書き込み、分析とオンラインサービスを高速化できます。次のサンプルコマンドに例を示します。

      -- Hologres 外部テーブルにアクセスするために、次のプロパティを追加します。
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      SET odps.table.api.enable.holo.table=true; -- JDBC 直接読み取りモードを有効にします。
      -- Hologres 外部テーブルにデータを挿入します。
      INSERT INTO my_table_holo_jdbc VALUES (12,'alice');
      -- Hologres 外部テーブルからデータをクエリします。
      SELECT * FROM my_table_holo_jdbc;
      -- 次の結果が返されます。
      +------------+------------+
      | id         | name       | 
      +------------+------------+
      | 9          | hanmeimei  | 
      | 4          | tom        | 
      | 7          | haward     | 
      | 2          | mary       | 
      | 5          | lulu       | 
      | 12         | alice      | 
      | 8          | lilei      | 
      | 10         | lily       | 
      | 1          | kate       | 
      | 11         | lucy       | 
      | 6          | mark       | 
      | 3          | bob        | 
      +------------+------------+
    • 頻繁に更新されるディメンションテーブルを Hologres に保存して、リアルタイムの更新要件を満たすことができます。その後、MaxCompute は外部テーブルを使用してこれらのディメンションテーブルにアクセスし、MaxCompute に保存されているファクトテーブルとの関連分析を実行できます。次のサンプルコマンドに例を示します。

      -- Hologres 外部テーブルにアクセスするために、次のプロパティを追加します。
      SET odps.sql.split.hive.bridge=true;
      SET odps.sql.hive.compatible=true;
      -- MaxCompute 内部テーブルを作成します。
      CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc;
      -- MaxCompute 内部テーブルと Hologres 外部テーブルの関連分析を実行します。
      SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id;
      -- 次の結果が返されます。
      +------------+------------+------------+------------+
      | id         | name       | id2        | name2      | 
      +------------+------------+------------+------------+
      | 9          | hanmeimei  | 9          | hanmeimei  | 
      | 4          | tom        | 4          | tom        | 
      | 7          | haward     | 7          | haward     | 
      | 2          | mary       | 2          | mary       | 
      | 5          | lulu       | 5          | lulu       | 
      | 12         | alice      | 12         | alice      | 
      | 8          | lilei      | 8          | lilei      | 
      | 10         | lily       | 10         | lily       | 
      | 1          | kate       | 1          | kate       | 
      | 11         | lucy       | 11         | lucy       | 
      | 6          | mark       | 6          | mark       | 
      | 3          | bob        | 3          | bob        | 
      +------------+------------+------------+------------+

Hologres 外部テーブルの作成 (デュアル署名モード)

デュアル署名は、MaxCompute と Hologres が共同で開発した認証および権限付与プロトコルです。MaxCompute 側でログイン情報が署名された後、認証データが Hologres 側に渡されます。Hologres は、MaxCompute と合意した基盤プロトコルに基づいて認証と権限付与を実行します。これにより、MaxCompute と Hologres の両方で同じアカウント名を持つユーザーが、追加の認証設定なしで外部テーブルにアクセスできます。

前提条件

  1. MaxCompute クライアントがインストールされ、設定済みであること

  2. Hologres 外部テーブルを作成するための宛先 MaxCompute プロジェクトが利用可能であること。

    MaxCompute プロジェクトの作成方法については、「MaxCompute プロジェクトの作成」をご参照ください。

  3. MaxCompute アカウントと同じ名前のアカウントが Hologres に存在し、このアカウントが Hologres の対応するテーブルに対する読み取りおよび書き込み権限を持っていること。

  4. Hologres V1.3 以降のみが、MaxCompute でのデュアル署名モードでの Hologres 外部テーブルの作成をサポートしています。現在、デュアル署名モードは Hologres 外部テーブルからのデータ読み取りのみをサポートしており、データ書き込みはサポートしていません。

MaxCompute で外部テーブルを作成する

  1. MaxCompute クライアントにログインし、宛先の MaxCompute プロジェクトに切り替えます。

  2. 次のコマンドを実行して、Hologres 外部テーブルを作成します。

    データの準備」ステップで準備した Hologres インスタンス情報は次のとおりです:

    • Hologres データベース名:holo_external_test

    • Hologres データベーススキーマ:public

    • Hologres テーブル名:holo

    • Hologres データベースのクラシックネットワークエンドポイント:hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80

    -- 外部テーブルを作成します。
    CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl
    (
      id int,
      name string
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute&currentSchema=public&preferQueryMode=simple&useSSL=false&table=<table name>/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
      'odps.federation.jdbc.colmapping'='id:id,name:name'
    );
  3. 外部テーブルをクエリします。

    -- 外部テーブルをクエリします (デュアル署名スイッチを有効にするコマンドと一緒に実行する必要があります)。
    SET odps.sql.common.table.planner.ext.hive.bridge=true;
    SELECT * FROM holo_mc_external_dbl;
    
    -- 次の結果が返されます。
    +------------+------------+
    | id         | name       | 
    +------------+------------+
    | 9          | hanmeimei  | 
    | 4          | tom        | 
    | 7          | haward     | 
    | 2          | mary       | 
    | 5          | lulu       | 
    | 12         | alice      | 
    | 8          | lilei      | 
    | 10         | lily       | 
    | 1          | kate       | 
    | 11         | lucy       | 
    | 6          | mark       | 
    | 3          | bob        | 
    +------------+------------+

Hologres 外部テーブルの直接読み取り機能を有効にする

MaxCompute は JDBC モードで Hologres 外部テーブルからデータを読み取ります。MaxCompute は Hologres ストレージレイヤーからの直接読み取りもサポートしており、以下の利点があります:

  • テーブルの読み取りレイテンシを大幅に削減し、データクエリの速度を向上させます。

  • Hologres フロントエンド (FE) への接続数を大幅に削減します。ほとんどのクエリは 1 つの接続のみを必要とします。

制限

Hologres 直接読み取りモードが有効な場合、以下の制限が適用されます。条件が満たされない場合、システムは JDBC モードにフォールバックします。

  1. バージョン要件

    Hologres インスタンスは V1.3.34 以降である必要があります。V1.3.34 より前のバージョンは直接読み取り機能をサポートしていません。

  2. テーブルタイプの制限

    • Hologres コールドストレージテーブルの直接読み取りはサポートされていません。

    • Hologres 行指向テーブルの直接読み取りはサポートされていません。

  3. データ型マッピングの制限

    MaxCompute が直接読み取りモードで Hologres の Timestamp With Time Zone 型をマッピングするために Timestamp 型を使用する場合、わずかな時間エラーが発生する可能性があります。具体的な違いは次のとおりです:

    • 時間値のエラー

      • Hologres の Timestamp With Time Zone 列の時刻が 1900-12-31 15:54:15 より前の場合、MaxCompute がクエリする時刻は 5 分 44 秒進みます。

      • Hologres の Timestamp With Time Zone 列の時刻が 1900-12-31 15:54:16 から 1969-12-31 23:59:58 の間の場合、MaxCompute がクエリする時刻は 1 秒進みます。

      • Hologres の Timestamp With Time Zone 列の時刻が 1969-12-31 23:59:59 以降の場合、MaxCompute がクエリする時刻は Hologres の時刻と同じです。

    • タイムゾーンのオフセット

      • MaxCompute のタイムゾーンが UTC+8 で、Hologres の Timestamp With Time Zone 列の時刻が 2000-01-01 00:00:00 の場合、MaxCompute がクエリする時刻は 2000-01-01 08:00:00 です。

      • MaxCompute のタイムゾーンが UTC+8 で、Hologres の Timestamp With Time Zone 列の時刻が 1969-01-01 00:00:00 の場合、MaxCompute がクエリする時刻は 1969-01-01 08:00:01 です。

  4. 同一リージョン制限

    ネットワーク接続の制限により、MaxCompute は同じリージョン内の Hologres インスタンスにのみアクセスできます。リージョン間のアクセスはエラーになります:FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3

  5. Hologres がプライマリ/セカンダリ アーキテクチャで構成されている場合、プライマリインスタンスの接続 URL のみ設定できます。セカンダリインスタンスはサポートされていません。

  6. Foreign Server モードの追加制限:MaxCompute プロジェクトでスキーマレベルの構文スイッチを有効にする必要があります。

有効化方法

MaxCompute で Hologres 外部テーブルをクエリする際に、SQL ステートメントの前に次のパラメーターを追加します。

SET odps.table.api.enable.holo.table=true;

プロジェクトレベルの直接読み取りスイッチを設定します。

-- 直接読み取りスイッチと JDBC へのフォールバックを無効にするスイッチは、両方ともプロジェクトレベルで設定できます。
-- プロジェクトレベルで直接読み取りスイッチを有効にする:
setproject odps.table.api.enable.holo.table=true; --true で有効化 | false で無効化

-- デフォルトの JDBC へのフォールバックを無効にする:
setproject odps.table.api.allow.fallback.jdbc=false; --true でフォールバック | false でフォールバックしない

直接読み取りを確認する

Logview のログを確認することで、クエリが直接読み取りモードを使用したかどうかを判断できます。Logview の使用方法の詳細については、「Logview 2.0 を使用してジョブの実行情報を表示する」をご参照ください。

Logview の サマリータブで、external holo tables フィールドを見つけて、そのプロパティを表示します。プロパティのフォーマットは次のとおりです:

<project_name>.<table_name>:<access_mode>[<(fallback_reason)>]

パラメーター

パラメーター

説明

project_name

プロジェクト名。

table_name

テーブル名。

アクセスモード

外部テーブルのアクセスモード。有効値:

  • Optimized:直接読み取りモードが使用されたことを示します。次の Logview の例はこのモードを示しています。直读模式

  • Fallback:システムが JDBC モードにフォールバックしたことを示します。次の Logview の例はこのモードを示しています。回退为JDBC模式

フォールバック理由

アクセスモードFallback の場合、このパラメーターは JDBC モードにフォールバックした理由を示します。次の値と解決策が提供されます:

  • Column type map error Column name ${ColumnName}:MaxCompute テーブルと Hologres テーブルの対応する列の型が一致しないか、互換性がありません。直接読み取りモードを使用するには、データ型マッピングに基づいて外部テーブルのデータ型を変更してください。

  • Holo connection error:Hologres インスタンスの接続が異常です。これは、権限情報が正しくないか、Hologres インスタンスの状態が正しくないことが原因である可能性があります。現在のユーザーが対応する Hologres データベースにアクセスする権限を持っているか、または Hologres インスタンスが現在サービス可能な状態にあるかを確認してください。

  • Odps table is partition table:MaxCompute で作成された Hologres 外部テーブルはパーティションテーブルです。これは現在サポートされていません。

  • Select hg_version errorHologres version check error、または Fetch hg_version data error:Hologres インスタンスのバージョンが正しくありません。Hologres インスタンスを V1.3.34 以降にアップグレードしてください。インスタンスのアップグレード方法の詳細については、「インスタンスのアップグレード」をご参照ください。

直接読み取りモードで実行されているタスクは、直接読み取りの制限に遭遇すると JDBC モードにフォールバックする可能性があります。ビジネス負荷が高い場合、このフォールバックは多くの Hologres 接続プールリソースを消費する可能性があります。さらに、JDBC モードのデータ転送効率は直接読み取りモードよりもはるかに低く、リソースの解放も遅くなります。

JDBC モードへのフォールバックは Hologres インスタンスに負荷をかける可能性があることに注意してください。極端な場合、多くのフォールバックジョブが Hologres インスタンスにアクセスする他のサービスに影響を与える可能性があります。これを防ぐには、実行パラメーター set odps.table.api.allow.fallback.jdbc=false; を直接読み取りタスクに追加して自動フォールバックを無効にし、予期しない影響を回避できます。

Hologres データのインポートとエクスポート

  • Hologres から MaxCompute テーブルまたはパーティションにデータをインポートするには、LOAD コマンドを使用します。

  • MaxCompute プロジェクトから Hologres などの外部ストレージシステムにデータをエクスポートして他のコンピュートエンジンで使用するには、UNLOAD コマンドを使用します。

よくある質問

MaxCompute から Hologres データを直接読み取る際に発生する ODPS-0130071 エラーを解決するにはどうすればよいですか?

  • 症状

    Hologres データを直接読み取る際に、エラー ODPS-0130071 Failed to split to equal size...max count: 7777 が報告されます。例:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777
  • 原因

    MaxCompute が Hologres からデータを直接読み取る際、デフォルトの Mapper 分割ポリシー (入力データ量 / split.size 256 MB) を使用します。これにより、ジョブによって生成される Mapper タスクの数が最大制限の 7777 を超えてしまいます。

    説明

    この制限は、ユーザーが多数の Mapper タスクを生成するジョブを送信し、Hologres ファイルやネットワーク接続の安定性に影響を与えることを防ぐためのものです。

  • 解決策

    次のパラメーターを設定してエラーを解決できます。

    SET odps.external.holo.mapper.instances=10000; -- 並行処理の上限を増やします。最大値は 10000 です。
    SET odps.sql.mapper.split.size=512; -- タスクの並行処理を調整します。最大値は 512 MB です。

Hologres 外部テーブルで実行される SQL ジョブが遅いのはなぜですか?また、どうすれば修正できますか?

SDK を使用すると、MaxCompute 外部テーブルでのクエリが遅くなります。

  • 症状

    SDK を使用して MaxCompute 外部テーブルをクエリする SQL ジョブの実行が遅い。

  • 解決策

    外部テーブルは全表スキャンのみをサポートしているため、処理が遅くなります。代わりに MaxCompute 内部テーブルを使用することを推奨します。

Hologres でキーワードが列名として使用された場合に発生するエラーを解決するにはどうすればよいですか?

  • 症状

    Hologres でキーワードが特別な設定なしに列名として使用されると、次のエラーが発生します:

    ODPS-0123131:User defined function exception - SQLException in nextKeyValue

    Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","

  • 解決策

    odps.federation.jdbc.colmapping パラメーターを追加して、Hologres ソーステーブルと Hologres 外部テーブルの間のフィールドをマッピングします。

    たとえば、Hologres ソーステーブルにキーワードフィールド "offset" が含まれている場合、Hologres 外部テーブルを作成するときにパラメーター 'odps.federation.jdbc.colmapping'='offset:"offset"' を追加する必要があります。

参考資料

Hologres 外部テーブルに関するよくある質問への回答については、「データレイクハウス/外部テーブル FAQ」をご参照ください。