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

MaxCompute:Hologres 外部テーブル

最終更新日:Feb 07, 2026

このトピックでは、Hologres 外部テーブルの作成方法について説明します。また、CREATE EXTERNAL TABLE 文で Hologres データソースの指定、STS 認証情報の構成または二重署名の有効化、対象テーブルのマッピング、Java Database Connectivity (JDBC) ドライバーの詳細を設定する方法についても解説します。

はじめに

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

適用範囲

  • データ操作言語 (DML) 操作

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

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

      MaxCompute から Hologres へデータを上書きするには、Hologres 側で MaxCompute テーブルに対応する外部テーブルを読み取り、Hologres の INSERT OVERWRITE セマンティクスを使用してください。詳細については、「INSERT OVERWRITE」をご参照ください。

  • データ書き込みリスク

    Hologres 外部テーブルに大量のデータを書き込む場合、複数プロセスによる並列書き込みによってデータの再書き込みが発生し、重複することがあります。

  • パーティション

    Hologres のパーティションテーブルは MaxCompute のパーティションテーブルに対応しません。Hologres 外部テーブルはパーティションをサポートしていません。ただし、ダイレクトリードモードでは、Hologres のパーティション親テーブルに対応する Hologres 外部テーブルをクエリする際に、クエリ条件が子テーブルのパーティションキー列と一致する場合、パーティションプルーニングが適用されます。

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

  • Hologres 外部テーブルは Hologres の動的テーブル (Dynamic Table) に対応できません。

  • サポートされるデータの型

Hologres 外部テーブルの作成

Hologres 外部テーブルは STS モードまたは二重署名モードで作成します。

注意事項

外部テーブル作成ルール

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

  • Hologres の親テーブルおよび子テーブルの場合、テーブル名は Hologres 外部テーブルおよび SQL 文で指定されます。親テーブルおよび子テーブルのいずれも Hologres 外部テーブルに対応できますが、親テーブルは読み取り専用です。

  • 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 認証情報を構成するか二重署名を有効にして JDBC エンドポイントを指定することで、Hologres データソースにアクセスします。

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

サンプルコードについては、「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 を設定すると、このモードが有効になります。

いいえ

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

IF NOT EXISTS

いいえ

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

  • IF NOT EXISTS を指定すると、同じ名前のテーブルが存在するかどうかに関係なく成功メッセージが返されます。これは、既存のテーブルのスキーマが作成しようとしているテーブルのスキーマと異なる場合でも同様です。既存のテーブルのメタデータは変更されません。

table_name

はい

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

col_name

はい

Hologres 外部テーブルの列名です。

data_type

はい

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

STORED BY

はい

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

値は com.aliyun.odps.jdbc.JdbcStorageHandler に固定されており、JdbcStorageHandler 接続方法を指定します。

ram_arn

はい

STS モードで Hologres 外部テーブルを作成する場合に必須です。外部テーブル作成時の STS 認証に使用する RAM ロールの Alibaba Cloud リソースネーム (ARN) を指定します。RAM ロールの作成および権限付与方法については、「Hologres での STS モードによる通常の RAM ロールの権限付与」をご参照ください。

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

  2. 左側のナビゲーションウィンドウで、ID > ロール を選択します。

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

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

いいえ

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

LOCATION

はい

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

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

    重要

    現在、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 フィールド名を二重引用符 ("") で囲む必要があります。形式: MaxCompute フィールド 1 : "Hologres フィールド 1"[ ,MaxCompute フィールド 2 : "Hologres フィールド 2" ,...]

      説明

      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 インスタンスがない場合は、まず「Hologres インスタンスの購入」を行ってください。

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

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

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

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

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 モード)

Hologres は、別の Alibaba Cloud アカウントの RAM ロールをデータベースインスタンスに追加することをサポートしていません。そのため、Hologres での通常のロール権限付与の STS モードは、同一アカウントに属する RAM ロールのみをサポートします。同様に、MaxCompute が Hologres 外部テーブルまたは外部スキーマにアクセスする場合も、同一アカウントの RAM ロールのみがサポートされます。

前提条件

  1. MaxCompute クライアントのインストールおよび構成」を行ってください。

  2. Hologres 外部テーブルを作成するための MaxCompute プロジェクトを準備してください。

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

  3. RAM ロールの作成および権限付与方法については、「Hologres での STS モードによる通常の RAM ロールの権限付与」をご参照ください。

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 とのデータ交換および結合分析を行います。

    • 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 外部テーブルからのデータ読み取りのみをサポートしており、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 外部テーブルからデータを読み取ります。現在のバージョンでは、Hologres ストレージレイヤーから直接データを読み取ることをサポートしており、以下のようなメリットがあります。

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

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

制限事項

Hologres のダイレクトリードを有効にすると、以下の制限事項が適用されます。いずれかの条件を満たさない場合、システムは JDBC モードにフォールバックします。

  1. バージョン要件

    Hologres インスタンスは 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 + 08:00 を使用しており、Hologres の TIMESTAMP WITH TIME ZONE 列の時間が 2000-01-01 00:00:00 の場合、MaxCompute でクエリされる時間は 2000-01-01 08:00:00 になります。

      • MaxCompute が UTC + 08:00 を使用しており、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 のみ使用できます。スレーブインスタンスの接続 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 V2.0 を使用したジョブ情報の表示」をご参照ください。

Logview の Summary タブで、external holo tables フィールドのプロパティを確認します。形式は以下のとおりです。

<project_name>.<table_name>:<Access mode>[<(Fallback reason)>]

パラメーターの説明:

パラメーター

説明

project_name

プロジェクト名です。

table_name

テーブル名です。

Access mode

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

  • Optimized: ダイレクトリードモードが使用されていることを示します。下図は Logview の例です。直读模式

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

Fallback reason

Access modeFallback の場合、このパラメーターはシステムが 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 モードにフォールバックすることがあります。ダイレクトリード中にワークロードが重い場合、JDBC モードへのフォールバックにより多くの Hologres 接続プールリソースを消費します。さらに、JDBC モードのデータ転送効率はダイレクトリードモードよりもはるかに低く、リソースの解放も遅くなります。

JDBC モードへのフォールバック後の Hologres インスタンスの負荷圧を監視してください。極端なケースでは、多数のフォールバックジョブが Hologres インスタンスにアクセスする他のサービスに影響を与える可能性があります。これを防ぐために、ダイレクトリードタスクに set odps.table.api.allow.fallback.jdbc=false; パラメーターを追加して自動フォールバックを無効にし、予期しない影響を回避してください。

Hologres データのインポートおよびエクスポート

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

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

サポートされるデータの型

  • 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 です。文字列の長さが n より短い場合、スペースで埋められます。

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 です。Hologres の JSON 型は JDBC モードでサポートされています。

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

INT

サポート

未サポート

サポート

Hologres の SERIAL 自動増分フィールドの場合、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 には対応するデータ型がありません。

よくある質問

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 から直接データを読み取る際、デフォルトのマッパー分割ポリシー (入力データ量 / split.size = 256 MB) を使用します。これにより、タスクによって生成される同時実行マッパーの数が最大制限の 7,777 を超えることがあります。

    説明

    この制限は、過剰なマッパーを生成するタスクの送信を防止し、Hologres ファイルまたはネットワーク接続の安定性に影響を与えることを防ぎます。

  • 解決策

    以下のパラメーターを設定することでエラーを解決できます。

    SET odps.external.holo.mapper.instances=10000; -- 同時実行の上限を増やします。最大値は 10,000 です。
    SET odps.sql.mapper.split.size=512; -- タスクの同時実行度を調整します。最大値は 512 MB です。

Hologres 外部テーブルで実行される SQL ジョブの実行が遅い場合はどうすればよいですか?

SDK を使用して MaxCompute 外部テーブルからデータを検索するのが遅いです。

  • 問題

    SDK を使用して MaxCompute 外部テーブルからデータを検索するのが遅いです。

  • 解決策

    外部テーブルは全表スキャンのみをサポートしており、速度が遅いです。代わりに 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 外部テーブルに関する一般的な問題の詳細については、「データレイクハウスおよび外部テーブルに関する一般的な問題」をご参照ください。