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

MaxCompute:Hologres 外部テーブル

最終更新日:Jul 02, 2026

このトピックでは、CREATE TABLE 文で Hologres データソース、権限付与方法 (STS 認証またはサービスリンクロール)、ターゲットテーブル、および JDBC ドライバー情報を指定して、Hologres 外部テーブルを作成する方法について説明します。

概要

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

制限事項

  • データ操作 (DML)

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

    • Hologres 外部テーブルは INSERT OVERWRITE 文をサポートしていません。

      MaxCompute のデータで Hologres テーブルのデータを上書きするには、Hologres で INSERT OVERWRITE 文を実行します。この文は、MaxCompute テーブルにマッピングされた Hologres の外部テーブルからデータを読み取ります。詳細については、「INSERT OVERWRITE」をご参照ください。

  • データ書き込みリスク

    Hologres 外部テーブルに大量のデータを書き込む場合、並列書き込みプロセスが使用されます。まれに、これらのプロセスの 1 つがデータを再書き込みし、データが重複する可能性があります。

  • パーティション

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

  • Hologres 外部テーブルは cluster 属性をサポートしていません。

  • Hologres 外部テーブルは、Hologres Dynamic Table へのマッピングをサポートしていません。

  • サポートされるデータ型のリストをご参照ください。

Hologres 外部テーブルの作成

Hologres の RAM ロール権限付与 (STS モード) または サービスリンクロール権限付与モード (ダブル署名モード) のいずれかを使用して Hologres 外部テーブルを作成できます。

注意事項

外部テーブル作成のガイドライン

  • ご利用の Hologres インスタンスが外部アクセスに IP ホワイトリストを使用している場合は、サポートされているバージョンにアップグレードしてください:

    • RAM ロール権限付与モードの場合、Hologres V3.2 以降にアップグレードしてください。

    • サービスリンクロール権限付与モードの場合、Hologres V2.0.28 以降にアップグレードしてください。

    アップグレード後、Hologres は MaxCompute サービス ID またはサービスリンクロールに基づいて MaxCompute ノード IP を自動的に信頼します。ご利用の Hologres インスタンスの IP ホワイトリストに MaxCompute エラスティックノードの IP アドレスを追加する必要はなくなります。

  • Hologres の親テーブルと子テーブルの両方を外部テーブルにマッピングできます。ただし、親テーブルにマッピングされた外部テーブルからは読み取りのみ可能で、書き込みはできません。

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

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

スキーマの互換性

Hologres ソーステーブルのスキーマが外部テーブルのスキーマと一致しない場合は、次の点にご注意ください:

  • 列数の不一致:ソーステーブルの列数が外部テーブルより少ない場合、column "xxx" does not exist のようなエラーでデータ読み取りが失敗します。ソーステーブルの列数が外部テーブルより多い場合、余分な列は無視されます。

  • 列の型の不一致:MaxCompute は、Hologres ソーステーブルの STRING 型の列を外部テーブルの INT 型の列にマッピングできません。INT 型の列を STRING 型の列にマッピングすることはサポートされていますが、推奨されません。

構文

外部テーブルを作成する際には、DDL 文で StorageHandler を指定し、Hologres データソースにアクセスするための JDBC 接続文字列と STS 認証情報 (またはサービスリンクロール権限付与モードを有効にする) を設定する必要があります。

RAM ロールモード

完全なコードサンプルについては、「Hologres 外部テーブルの作成 (RAM ロール権限付与モード)」をご参照ください。

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 外部テーブルの作成 (サービスリンクロール権限付与モード)」をご参照ください。

サービスリンクロール権限付与モードでは、同じ RAM ユーザーが手動での権限付与を必要とせずに、MaxCompute と Hologres の両方で権限のあるテーブルにアクセスできます。このモードは、Hologres の IP ホワイトリスト機能もサポートしており、使用を簡素化します。

-- 外部テーブルの作成
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>,...']
);

パラメーター

パラメーターの詳細を表示するにはクリックしてください

パラメーター

必須

説明

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

はい

このパラメーターは、STS モードで Hologres 外部テーブルを作成する際に必須です。STS 認証用の RAM ロールの ARN を指定します。RAM ロールの作成と権限付与の方法については、「Hologres RAM ロールの権限付与」をご参照ください。

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

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

  3. ロール ページで、ターゲットの ロール名 をクリックして、ロールの詳細ページに移動します。

  4. 基本情報 セクションで、ARN を取得できます。

いいえ

このパラメーターはダブル署名モードでは必須ではありません。

LOCATION

はい

Hologres インスタンスの JDBC 接続文字列。以下のパラメーターが含まれます:

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

    重要

    現在、Hologres にはクラシックネットワーク経由でのみ接続できます。VPC 経由の接続はサポートされていません。

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

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

    2. 左側のナビゲーションウィンドウで、Instances をクリックします。

      Instances ページで、ターゲットインスタンスの名前をクリックします。

    3. Network Information セクションで、Hologres インスタンスのクラシックネットワークドメイン名とポートを確認します。

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

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

  • schema:オプション。テーブル名がデータベース内で一意である場合、またはソーステーブルがデフォルトのスキーマにある場合は、このパラメーターを省略できます。詳細については、「CREATE SCHEMA」をご参照ください。

  • holo_table_name:必須。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 の列名に大文字が含まれている場合は、列名を二重引用符 ("") で囲みます。フォーマット:MaxCompute_column_1:"Hologres_column_1"[,MaxCompute_column_2:"Hologres_column_2",...]

      説明

      Hologres ソーステーブルに c bool, map_B string, a bigint の列があり、外部テーブルに a bigint, x string, c bool の列があるとします。

      colmapping の設定が 'x: "map_B"' の場合、Hologres データを正常にマッピングしてクエリできます。

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

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

ステップ 1:Hologres データの準備

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

Hologres データベースの作成

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

  2. 左側のナビゲーションウィンドウで、Instances をクリックします。

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

    Instances ページで、ターゲットインスタンスの名前をクリックします。

  4. インスタンスの詳細ページで、Connect to Instance をクリックします。

  5. Metadata Management タブをクリックします。

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

Hologres テーブルの作成

  1. インスタンスの詳細ページで、Connect to Instance をクリックします。

  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;

ステップ 2:Hologres 外部テーブルの作成

RAM ロール

このモードでは、外部テーブルの作成者が、Hologres データへのアクセス権限を持つ RAM ロールを外部テーブル定義に埋め込みます。その後、必要に応じてこの外部テーブルに対する権限を他の MaxCompute ユーザーに付与できます。ユーザーが外部テーブルにアクセスすると、システムはバインドされた RAM ロールを使用して、マッピングされた Hologres テーブルのデータにアクセスします。

Hologres は、クロスアカウントの RAM ロールをデータベースインスタンスに追加することをサポートしていません。したがって、STS モードの Hologres は、同じアカウントの RAM ロールのみをサポートします。同様に、MaxCompute が外部テーブルまたは外部スキーマを使用して Hologres にアクセスする場合も、同じアカウントの RAM ロールのみがサポートされます。

前提条件

  1. MaxCompute クライアントをインストールおよび設定していること。

  2. Hologres 外部テーブルを作成するターゲットの MaxCompute プロジェクトがあること。

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

  3. RAM ロールを作成し、権限を付与していること。詳細については、「Hologres の RAM ロールの権限付与」をご参照ください。

MaxCompute での外部テーブルの作成

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

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

    次の例では、ステップ 1: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 外部テーブルにアクセスするには、以下のプロパティが必要です。
    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 データにアクセスするためにサービスリンクロールを作成する必要があります。不正アクセスを防ぐため、このモードはユーザーの ID を Hologres に転送して認証します。したがって、ユーザーは外部テーブルと基になる Hologres テーブルの両方に対する権限を持っている必要があります。

前提条件

  1. MaxCompute クライアントをインストールおよび設定していること。

  2. Hologres 外部テーブルを作成するターゲットの MaxCompute プロジェクトがあること。

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

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

  4. このサービスリンクロール権限付与モードは、Hologres V1.3 以降でのみサポートされています。現在、このモードは Hologres 外部テーブルからの読み取りのみをサポートしており、書き込みはサポートしていません。

MaxCompute での外部テーブルの作成

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

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

    次の例では、ステップ 1: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&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. 外部テーブルをクエリします。

    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 フロントエンドへの接続数を最小限に抑えます。ほとんどのクエリは単一の接続のみを必要とします。

制限事項

Hologres の直接読み取りモードを有効にすると、次の制限が適用されます。これらの条件が満たされない場合、クエリは JDBC モードにフォールバックします。

  1. バージョン要件

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

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

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

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

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

    直接読み取りモードを使用する場合、Hologres のタイムゾーン付きタイムスタンプ型を MaxCompute の TIMESTAMP 型にマッピングすると、わずかな時間の不一致が発生する可能性があります。違いは次のとおりです:

    • 時間の値の不一致

      • 1900-12-31 15:54:15 より前のタイムスタンプの場合、MaxCompute が返す時間は 5 分 44 秒進んでいます。

      • 1900-12-31 15:54:16 から 1969-12-31 23:59:58 までのタイムスタンプの場合、MaxCompute が返す時間は 1 秒進んでいます。

      • 1969-12-31 23:59:59 以降のタイムスタンプの場合、Hologres と MaxCompute の時間は同じです。

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

      • たとえば、MaxCompute のタイムゾーンが UTC+8 で、Hologres のタイムゾーン付きタイムスタンプ列が 2000-01-01 00:00:00 の場合、MaxCompute は 2000-01-01 08:00:00 を返します。

      • たとえば、MaxCompute のタイムゾーンが UTC+8 で、Hologres のタイムゾーン付きタイムスタンプ列が 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. 外部サーバーモードの追加制限:MaxCompute プロジェクトのスキーマレベルの構文スイッチを有効にする必要があります。

直接読み取りモードを有効にする

セッションの直接読み取りモードを有効にするには、MaxCompute で 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

テーブルの名前。

access mode

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

  • Optimized:直接読み取りモードが使用されていることを示します。以下は Logview の例です。Optimized:直接読み取り最適化モードが有効になっていることを示します。Logview の [概要] セクションに external holo tables: <project_name>.<table_name>:Optimized と表示されている場合、外部 Holo テーブルが直接読み取り最適化パスを使用したことを示します。

  • Fallback:システムが JDBC モードに戻ったことを示します。以下は Logview の例です。[概要] タブで、external holo tables セクションに aliorc_test.holo_lineitem:Fallback (Column type map error Column name l_orderkey Odps type 3 Holo type 4) のようなフォールバックメッセージが表示されている場合、直接読み取りモードが使用されなかったことを示します。代わりに、列の型マッピングエラーのため、システムはフォールバックモードに戻りました。

fallback reason

access modeFallback の場合、このパラメーターはクエリが JDBC モードに戻った理由を説明します。考えられる理由とその解決策は次のとおりです:

  • Column type map error Column name ${ColumnName}:MaxCompute テーブルの列のデータ型が、対応する Hologres テーブルの列と互換性がありません。これを解決するには、外部テーブルのデータ型をデータ型マッピングに一致するように変更します。

  • Holo connection error:Hologres インスタンスへの接続に失敗しました。考えられる原因には、不正な権限や無効なインスタンスステータスが含まれます。現在のユーザーが Hologres データベースにアクセスするために必要な権限を持っていること、および Hologres インスタンスが実行中であることを確認してください。

  • Odps table is partition table:直接読み取りモードは、パーティション化された外部テーブルではサポートされていません。

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

直接読み取りモードを使用するジョブが制限に遭遇すると、自動的に JDBC モードにフォールバックします。高負荷のワークロード下では、このフォールバックは Hologres 接続プールから大量のリソースを消費する可能性があり、JDBC モードでのデータ転送は直接読み取りモードよりもはるかに非効率です。その結果、これらのリソースはゆっくりと解放され、ご利用の Hologres インスタンスの負荷が増加する可能性があります。

極端な場合、頻繁なフォールバックは、同じ Hologres インスタンスに依存する他のビジネスクリティカルなサービスに影響を与える可能性があります。これを防ぐには、ジョブに set odps.table.api.allow.fallback.jdbc=false; パラメーターを追加して、自動フォールバックメカニズムを無効にすることができます。これにより、ジョブはサイレントにフォールバックする代わりに失敗し、予期しないパフォーマンスの低下を防ぎます。

Hologres 外部テーブルの述語プッシュダウン

MaxCompute で Hologres 外部テーブルをクエリする場合、クエリのフィルター条件を Hologres にプッシュダウンできます。この手法は述語プッシュダウン (PPD) と呼ばれ、ソースでデータをフィルタリングすることで、転送されるデータ量を削減し、クエリパフォーマンスを向上させます。述語プッシュダウンは、特に次のシナリオで効果的です:

  • 大量のデータをフィルタリングする選択的なフィルター条件を持つクエリ。

  • 論理パーティションテーブルに対するクエリ。

注意事項

シナリオ

説明

コアパラメーター

predicate_pushdown_mode パラメーターの有効な値:

  • off:述語プッシュダウンを無効にし、すべてのデータを読み取ります。この設定は、開発環境でのデバッグと比較に使用できます。

  • on:述語プッシュダウンを有効にして、フィルタリングされたスナップショットのみを作成します。本番環境で推奨されます。

  • Debug:2 つのスナップショットを作成してパフォーマンスを比較します。これは、性能テストとトラブルシューティングに使用できます。

構文例:

set odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";

サポートされる型

INT、BIGINT、STRING、DATE、TIMESTAMP、BINARY

制限事項

  • 述語プッシュダウンは、ユーザー定義関数 (UDF) や組み込み関数をサポートしていません。

  • 暗黙的な変換中に CAST 式をドロップすることは現在サポートされていません。

  • holob 型は現在サポートされていません。

  • Hologres のプライマリキーテーブルで述語プッシュダウンを使用することはできません。

適用シナリオ

  • PPD をサポートする Hologres インスタンス。

  1. データを準備します。ご利用の Hologres インスタンスで、テストテーブルを作成し、データを挿入します。

    CREATE TABLE test_multi_type_ppd (
      c_id INT NOT NULL,
      c_boolean BOOLEAN,
      c_int INT,
      c_bigint BIGINT,
      c_double DOUBLE precision,
      c_float REAL,
      c_string TEXT,
      c_date DATE,
      c_timestamp_tz TIMESTAMPTZ,
      c_timestamp_ntz TIMESTAMP
    )
    WITH (SEGMENT_KEY = 'c_id');
    -- 10行のデータを挿入します。
    INSERT INTO test_multi_type_ppd VALUES
    (1,  true,   10,  1000,   1.25,  1.5,  'alpha',   '2023-01-01', '2023-01-01 10:00:00+08', '2023-01-01 02:00:00'),
    (2,  false,  20,  2000,  -2.50,  2.5,  'beta',    '2023-01-02', '2023-01-02 10:00:00+08', '2023-01-02 02:00:00'),
    (3,  true,   30,  3000,   3.75, -3.5,  'gamma',   '2023-01-03', '2023-01-03 10:00:00+08', '2023-01-03 02:00:00'),
    (4,  false,  40,  4000,   4.00,  4.5,  'delta',   '2023-01-04', '2023-01-04 10:00:00+08', '2023-01-04 02:00:00'),
    (5,  true,   50,  5000,   5.50,  5.5,  'epsilon', '2023-01-05', '2023-01-05 10:00:00+08', '2023-01-05 02:00:00'),
    (6,  false,  60,  6000,   6.60,  6.0,  'zeta',    '2023-01-06', '2023-01-06 10:00:00+08', '2023-01-06 02:00:00'),
    (7,  true,   70,  7000,   7.70, -7.0,  'eta',     '2023-01-07', '2023-01-07 10:00:00+08', '2023-01-07 02:00:00'),
    (8,  false,  80,  8000,   8.80,  8.0,  'theta',   '2023-01-08', '2023-01-08 10:00:00+08', '2023-01-08 02:00:00'),
    (9,  true,   90,  9000,  -9.90,  9.0,  'iota',    '2023-01-09', '2023-01-09 10:00:00+08', '2023-01-09 02:00:00'),
    (10, false, 100, 10000,  10.10, 10.0,  'kappa',   '2023-01-10', '2023-01-10 10:00:00+08', '2023-01-10 02:00:00');
    SELECT * FROM test_multi_type_ppd;
  2. MaxCompute で Hologres 外部テーブルを作成します。

    CREATE EXTERNAL TABLE test_multi_type_ppd
    (
      c_id int,
      c_boolean boolean,
      c_int int,
      c_bigint bigint,
      c_double double,
      c_float float,
      c_string string,
      c_date date,
      c_timestamp_tz timestamp,
      c_timestamp_ntz timestamp_ntz
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    LOCATION 'jdbc:postgresql://<holo-endpoint>/<db>?currentSchema=public&table=test_multi_type_ppd'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo'
    );
  3. 外部テーブルをクエリします。

    -- Hologres 直接読み取りを有効にします。
    SET odps.table.api.enable.holo.table=true;
    -- PPD モード (off、on、または debug) を設定します。
    SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}";
    -- 型システムを設定します。
    SET odps.sql.type.system.odps2=true;
    SET odps.sql.decimal.odps2=true;
    -- 式を TableScan にプッシュダウンできるようにします。これは通常、デフォルトで有効になっています。
    SET odps.use.builtin.function.input.range=true;
    -- set odps.mcqa.disable=true;
    SELECT * FROM test_multi_type_ppd WHERE c_id = 3;
    -- クエリは次の結果を返します。
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | c_id | c_boolean | c_int | c_bigint   | c_double   | c_float | c_string | c_date | c_timestamp_tz | c_timestamp_ntz |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    | 3    | true      | 30    | 3000       | 3.75       | -3.5    | gamma    | 2023-01-03 | 2023-01-03 10:00:00 | 2023-01-03 02:00:00 |
    +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+
    -- Logview の概要セクションを確認します。次の情報が表示されます:
    external holo tables:
    	**.default.test_multi_type_ppd:Optimized
      Holo-side PPD enabled -->   Filter pushdown applied successfully
      Snapshot Id: 56-1-100***
      With-filter file count: 2
      With-filter create snapshot duration: 19ms

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

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

  • MaxCompute プロジェクトから Hologres にデータをエクスポートして他のコンピュートエンジンで使用するには、UNLOAD を使用します。

サポートされるデータ型

  • Decimal 型の制限

    MaxCompute で作成された Hologres 外部テーブルの場合、DECIMAL データ型は decimal(38,18) に固定されており、変更できません。ソーステーブルの小数点以下の桁数が少ない場合は、MaxCompute 外部テーブルで列を STRING 型として定義し、使用時に CAST 関数を使用してデータを明示的にキャストできます。

  • 複雑なデータ型の制限

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

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

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

次の表に、Hologres と 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 型はマイクロ秒の精度を持ち、タイムゾーンはありません。

これは MaxCompute の TIMESTAMP_NTZ にマッピングされ、ナノ秒の精度を持ちます。精度の違いにより、不一致が生じる可能性があります。

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

TIMESTAMP

サポート済み

サポート対象外

サポート済み

タイムスタンプデータ型はナノ秒まで正確で、yyyy-mm-dd hh:mm:ss.xxxxxxxxx のフォーマットを使用します。

基になる精度の変換は自動的に処理されます。

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 は長さを指定します。最大長は 255 です。短い文字列はスペースで埋められます。

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

VARCHAR(n)

VARCHAR(n)

サポート済み

サポート済み

サポート済み

MaxCompute の VARCHAR(n) データ型は可変長の文字型です。n パラメーターは長さを指定し、1 から 65535 の範囲です。

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

DATE

DATE

サポート済み

サポート済み

サポート済み

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

INT4[]

ARRAY<INT>

サポート済み

サポート対象外

サポート済み

Hologres の配列は、対応する MaxCompute の ARRAY 型にマッピングされます。JDBC 経由で Hologres に配列を書き込むことはサポートされていないことに注意してください。

INT8[]

ARRAY<BIGINT>

サポート済み

サポート対象外

サポート済み

FLOAT4[]

ARRAY<FLOAT>

サポート済み

サポート対象外

サポート済み

FLOAT8[]

ARRAY<DOUBLE>

サポート済み

サポート対象外

サポート済み

BOOLEAN[]

ARRAY<BOOLEAN>

サポート済み

サポート対象外

サポート済み

TEXT[]

ARRAY<STRING>

サポート済み

サポート対象外

サポート済み

JSONB

JSON

サポート対象外

サポート対象外

サポート済み

Hologres の JSONB は MaxCompute の JSON 型にマッピングされます。このマッピングは直接読み取りモードでのみサポートされます。

JSON

STRING

サポート済み

サポート対象外

サポート対象外

JDBC を使用する場合、Hologres の JSON 型は MaxCompute の STRING 型にマッピングされ、サイズは 8 MB に制限されます。

SERIAL (自動インクリメント)

INT

サポート済み

サポート対象外

サポート済み

MaxCompute は Hologres の SERIAL フィールドを 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 データを直接読み取る際の 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 からデータを読み取る際、デフォルトのデータ分割戦略により、マッパーインスタンスの数が 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 外部テーブルのデータを検索すると、パフォーマンスが低下します。

  • ソリューション

    外部テーブルはフルテーブルスキャンのみをサポートするため、パフォーマンスが低下します。パフォーマンスを向上させるには、代わりに MaxCompute 内部テーブルを使用してください。

列名がキーワードである場合のエラー

  • 問題

    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"' パラメーターを追加します。

ダブル署名モードでの password authentication failed for user "mcslr$STS.******" エラー

  • 問題

    RAM ユーザーまたは RAM ロールがサービスリンクロール権限付与モード (ダブル署名モード) を使用して Hologres 外部テーブルを読み取ると、ジョブが password authentication failed for user "mcslr$STS.******" エラーで失敗する可能性があります。以下にエラーメッセージの例を示します:

    ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: splitByCommonTable() failed, dataSourceId=[TableScan1], tableId=[*****.*****], location=[jdbc:postgresql://hgpostcn-cn-*****-cn-beijing-internal.hologres.aliyuncs.com:80/*****?ApplicationName=MaxCompute&currentSchema=public&useSSL=false&table=*****/], rootCause -> common/table/jni/utils/jni_helper.cpp(126): UnretryableException: Common table io jni exception - ExceptionType: com.aliyun.odps.hive.wrapper.thrift.RequestException
    Message: null
    StackTrace:
    RequestException(reason:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: org.postgresql.util.PSQLException: FATAL: password authentication failed for user "mcslr$STS.*********"
  • ソリューション

    このエラーは、ユーザーが Hologres のテーブルに対する必要な読み取り権限を持っていないことを示します。これを解決するには、Alibaba Cloud アカウントまたは管理者アカウントで Hologres コンソールにログインします。コンソールで Security Center に移動し、ユーザー管理にユーザーを追加し、必要なデータベース権限を付与します。

直接読み取りモードでの Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo エラー

  • エラーメッセージ

    Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, 
    but FAILED to push down the filter into Holo, 
    errorMsg[storage/table/src/holo/snapshot.cpp(319): 
    StorageException: Create/Get snapshot failed for table: test_multi_type_ppd partition:  
    Query:select holo_create_table_snapshot('public.test_multi_type_ppd', 259200, filter=>$$c_id = 3$$) with error ERROR:  
    internal error: Failed to build fragment dag desc: node type 65 is not supported
  • ソリューション

    ご利用の Hologres 内部テーブルが「使用上の注意」の要件を満たしていることを確認してください。

参考

Hologres 外部テーブルに関する一般的な問題の詳細については、「レイクハウスと外部テーブルに関するよくある質問」をご参照ください。