全部產品
Search
文件中心

MaxCompute:Hologres外部表格

更新時間:Jan 14, 2026

本文介紹如何建立Hologres外部表格,以及如何在外部表格建表語句中指定Hologres資料來源、STS認證資訊或開啟雙簽名開關、映射目標表、JDBC驅動資訊。

功能介紹

Hologres是相容PostgreSQL協議的即時互動式分析資料倉庫,在底層與MaxCompute無縫串連。通過在MaxCompute上建立Hologres外部表格,可以實現基於PostgreSQL JDBC驅動及STS認證資訊查詢Hologres資料來源的資料。該方式無冗餘儲存,無需匯入匯出資料,可實現快速擷取查詢結果。

適用範圍

  • 資料操作(DML)

    • MaxCompute不支援對建立的Hologres外部表格執行更新(UPDATE)、刪除(DELETE)操作。

    • 不支援對Hologres外部表格執行INSERT OVERWRITE操作:

      從Hologres側讀取Hologres映射MaxCompute的外表,通過Hologres的INSERT OVERWRITE語義完成從MaxCompute到Hologres的資料覆蓋寫入,詳情請參見INSERT OVERWRITE

  • 資料寫入風險

    當向Hologres外部表格寫入大量資料時,由於採用並行多進程寫入,會存在小機率某個寫入進程資料重寫的情況,從而導致資料重複。

  • 分區

    Hologres的分區表和MaxCompute的分區表沒有對應關係。Hologres外部表格不支援分區,但直讀模式下,查詢MaxCompute的Hologres外部表格映射Hologres的分區父表時,查詢條件匹配分區子表的分區列,可以進行分區裁剪。

  • Hologres外部表格不支援cluster屬性。

  • Hologres外部表格不支援映射Hologres的Dynamic Table。

支援資料類型

  • 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為長度。最大取值為255。長度不足則使用空格填充。

Hologres的CHAR(n) 最大為1G。

VARCHAR(n)

VARCHAR(n)

已開通

已開通

已開通

MaxCompute的VARCHAR(n)為可變長度字元類型,n為長度。取值範圍為1~65535。

Hologres的VARCHAR(n) 最大為1G。

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模式建立Hologres外部表格,MaxCompute訪問Hologres時會被IP白名單攔截。

  • 對於Hologres的父表、子表,Hologres外部表格中會指定表名,並執行SQL語句。父表、子表都可以映射至Hologres外部表格,但是父表只能讀不能寫。

  • 向Hologres外部表格寫入資料時,暫不支援Hologres的INSERT ON CONFLICT(UPSERT)機制。如果Hologres源表有主鍵,請避免寫入的資料與Hologres源表中的資料產生主鍵唯一性衝突。

  • 表名和欄位名大小寫不敏感,且在建立表、查詢表及欄位時不支援強制轉換大小寫。

Schema相容性

當Hologres源表中的Schema與外表Schema不一致時:

  • 列數不一致:如果Hologres源表中的列數小於外表DDL的列數,則讀取RDS資料時,系統會報錯。例如column "xxx" does not exist。當Hologres源表中的列數大於外表DDL的列數時,系統會丟棄超出的列資料。

  • 列類型不一致:MaxCompute不支援使用INT類型接收Hologres源表中的STRING類型資料,支援使用STRING類型接收INT類型資料(不推薦)。

文法說明

在建立外部表格時,需要在建表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對應有許可權的表,不需要再手工授權。同時支援HologresIP白名單能力,便於使用。

-- 開啟雙簽名開關
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外部表格必填。指定RAM角色的ARN資訊,用於建立外部表格時STS認證資訊的填寫。

  1. 登入RAM控制台

  2. 在左側導覽列選擇身份管理 > 角色

  3. 角色頁面,單擊目標角色名稱,進入該角色詳情頁。

  4. 基礎資訊地區,可以擷取ARN資訊。

通過雙簽名模式建立Hologres外部表格不需要填寫。

LOCATION

Hologres執行個體的JDBC串連地址。其中:

  • endpoint:必填。Hologres執行個體的傳統網路網域名稱

    重要

    目前僅支援通過傳統網路網域名稱進行訪問。不支援通過VPC 網路網域名稱訪問Hologres。

  • port:必填。Hologres執行個體的網路連接埠

    1. 登入Hologres管理主控台,在左上方選擇地區。

    2. 在左側導覽列選擇執行個體列表

      執行個體列表頁面,單擊目標執行個體名稱。

    3. 網路資訊地區擷取Hologres執行個體的傳統網路網域名稱和網路連接埠。

  • database:必填。串連的Hologres資料庫名稱。更多Hologres資料庫資訊,請參見CREATE DATABASE

  • ApplicationName:必填。預設為MaxCompute,無需修改。

  • schema:可選。如果表名在Hologres資料庫內是唯一的,或源表是預設Schema中的表,可以不配置該屬性。更多Schema資訊,請參見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欄位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執行個體

    執行個體列表頁面,單擊目標執行個體名稱。

  4. 在執行個體詳情頁面,單擊登入執行個體

  5. 單擊上方中繼資料管理頁簽。

    單擊建立資料庫,在彈出的對話方塊中,填寫資料庫名稱,其他參數保持預設。

建立Hologres表

  1. 在執行個體詳情頁面,單擊登入執行個體

  2. 單擊上方SQL編輯器頁簽。

  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不支援將跨主帳號的RAM Role添加至資料庫執行個體,所以Hologres的STS模式普通角色授權只支援同帳號的RAM Role。

相應的,MaxCompute訪問Hologres的外部表格或外部schema,都只支援同帳號的RAM Role。

  1. 建立RAM角色

    建立RAM角色擷取ARN資訊,用於建立外部表格時填寫STS認證資訊。建立RAM角色的信任主體類型根據實際需求選擇,本樣本中信任主體類型為雲帳號。

    操作步驟如下:

    1. 登入RAM控制台

    2. 在左側導覽列選擇身份管理 > 角色

    3. 角色頁面,單擊建立角色

    4. 建立角色頁面,選擇信任主體類型雲帳號

    5. 信任主體名稱選擇當前雲帳號

  2. 修改信任策略配置內容

    1. 角色頁面,單擊目標角色名稱,進入該角色詳情頁。

    2. 信任策略頁簽,單擊編輯信任策略,在編輯信任策略頁面選擇指令碼編輯頁簽。

    3. 參照如下內容修改信任策略配置

      修改信任策略配置內容與選擇的可信實體類型相關。其中<UID>即阿里雲帳號ID,可在使用者資訊頁面擷取。

      可信實體類型為阿里雲帳號

      {
        "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"
      }

      可信實體類型為身份供應商

      {
        "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執行個體的開發許可權,才能在許可權範圍內使用Hologres。由於RAM角色預設沒有Hologres管理主控台的查看和操作執行個體的許可權,因此需要阿里雲帳號完成RAM相關許可權授予才能進行後續操作。將RAM角色添加至Hologres執行個體。授權方式及步驟如下:

    通過Hologres管理主控台授權

    1. 登入Hologres管理主控台,在左上方選擇地區。

    2. 在左側導覽列選擇執行個體列表

    3. 執行個體列表頁面,單擊目標執行個體名稱。

    4. 在執行個體詳情頁面,單擊登入執行個體

    5. 單擊上面資訊安全中心頁簽。

      在左側導覽列選擇使用者管理

    6. 使用者管理頁面,單擊右上方新增使用者,在彈出的新增使用者頁面,添加RAM角色至Hologres執行個體。

    7. DB授權頁簽,為該RAM角色授予執行個體的開發許可權。

      若資料庫的權限原則設定為專家模式,則需在使用者管理頁面將角色類型修改為SuperUser,後續將不再需要進行資料庫授權操作。

      1. 在左側導覽列選擇DB 授權

      2. DB 授權頁面,單擊目標資料庫對應操作列的使用者授權

      3. 在授權頁面,單擊右上方新增授權,在彈出的新增授權對話方塊,選擇RAM角色並配置Developer 使用者組

    通過RAM存取控制台授權

    若是通過RAM使用者扮演RAM角色,RAM使用者預設沒有Hologres管理主控台的許可權,需要阿里雲帳號給RAM使用者在存取控制頁面授予AliyunRAMReadOnlyAccess許可權,否則RAM使用者無法在Hologres管理主控台進行任何操作。詳情請參見文檔授予RAM使用者權限

    1. 登入RAM控制台

    2. 在左側導覽列選擇身份管理 > 角色

    3. 角色頁面,單擊目標角色名稱所在行操作列的新增授權

    4. 選擇AliyunRAMReadOnlyAccess許可權為當前角色授權。

    通過SQL方式授權

    通過SQL方式進行授權,授權SQL請參見Hologres許可權模型

在MaxCompute中建立外部表格

  1. 登入MaxCompute用戶端,進入目標MaxCompute專案。

  2. 執行如下命令建立Hologres外部表格。

    按照準備資料步驟,準備好的Hologres執行個體資訊如下:

    • Hologres資料庫名稱:holo_external_test

    • Hologres資料庫的Schema: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實現加速分析、線上服務。命令樣本如下。

      -- 訪問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. Hologres中存在跟MaxCompute相同名稱的帳號,並且該帳號具有Hologres中對應表的讀寫權限

  4. 僅Hologres V1.3及以上版本支援MaxCompute使用雙簽名模式建立Hologres外部表格,目前雙簽名模式只支援從Hologres外部表格中讀取資料,不支援寫入資料至Hologres外部表格。

在MaxCompute中建立外部表格

  1. 登入MaxCompute用戶端,進入目標MaxCompute專案。

  2. 執行如下命令建立Hologres外部表格。

    按照準備資料步驟,準備好的Hologres執行個體資訊如下:

    • Hologres資料庫名稱:holo_external_test

    • Hologres資料庫的Schema: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對Hologres外部表格的讀通過JDBC模式實現,目前版本支援MaxCompute直讀Hologres儲存層,能夠帶來以下優勢:

  • 可以大幅降低讀表的延遲,顯著提高查詢資料的速度。

  • 可以大幅度減少Hologres FE的串連數,大多數Query僅需要一個串連數。

使用限制

當開啟Hologres直讀模式時,使用限制如下,在條件不滿足時會回退到JDBC模式。

  1. 版本要求

    Hologres執行個體版本必須為V1.3.34及以上。低於V1.3.34的版本不支援直讀功能。

  2. 表類型限制

    • 不支援直讀Hologres冷存表。

    • 不支援直讀Hologres行存表。

  3. 資料類型映射限制

    MaxCompute直讀模式使用Timestamp類型映射Hologres中的Timestamp With Time Zone類型會存在細微的時間誤差,具體差異如下:

    • 時間值誤差

      • Hologres中Timestamp With Time Zone類型列的時間在1900-12-31 15:54:15 之前,MaxCompute查詢出來的時間會多5分44秒。

      • Hologres中Timestamp With Time Zone類型列的時間在1900-12-31 15:54:161969-12-31 23:59:58之間,MaxCompute查詢出來的時間會多1秒。

      • Hologres中Timestamp With Time Zone類型列的時間在1969-12-31 23:59:59之後,MaxCompute查詢出來的時間與Hologres中的無區別。

    • 時區位移

      • 以MaxCompute的時區為東八區為例,Hologres中Timestamp With Time Zone類型列的時間為2000-01-01 00:00:00,MaxCompute查詢出來的時間為2000-01-01 08:00:00

      • 以MaxCompute的時區為東八區為例,Hologres中Timestamp With Time Zone類型列的時間為1969-01-01 00:00:00,MaxCompute查詢出來的時間為1969-01-01 08:00:01

  4. 同Region限制

    由於網路連通性限制,只支援同Region的MaxCompute訪問Hologres執行個體。跨Region訪問會報錯: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專案需要開啟Schema級文法開關。

開啟方式

在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的Summary頁簽下,尋找external holo tables欄位查看屬性,屬性格式如下:

<project_name>.<table_name>:<訪問方式>[<(回退原因)>]

參數說明

參數

說明

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 errorFetch hg_version data error:Hologres執行個體版本有誤導致的,需要升級Hologres執行個體版本到V1.3.34或以上版本,升級執行個體版本詳情請參見執行個體升級

開啟了直讀模式啟動並執行任務,偶然觸發直讀限制情境,任務會回退成JDBC模式。如果直讀時業務負載比較大,回退成JDCBC模式會佔用大量的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 256MB),導致任務產生的Mapper並發數超過了最大限制數7777。

    說明

    該限制是防止使用者直接提交產生大量Mapper任務,從而對Hologres檔案或網路連接的穩定性產生影響。

  • 解決措施

    您可以通過設定以下參數,解決報錯問題。

    SET odps.external.holo.mapper.instances=10000; -- 提高並發上限,最高不超過10000。
    SET odps.sql.mapper.split.size=512; -- 調整任務並發數,最高不超過512M

基於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 ","

  • 解決措施

    添加參數映射Hologres源表和Hologres外部表格欄位關係:odps.federation.jdbc.colmapping

    例如:Hologres源表包含關鍵字欄位"offset",則建立Hologres外部表格時需要添加參數為'odps.federation.jdbc.colmapping'='offset:"offset"'

相關文檔

Hologres外部表格常見問題詳情,請參見湖倉一體/外部表格常見問題