全部產品
Search
文件中心

MaxCompute:Hologres外部表格

更新時間:Jun 19, 2024

當您需要訪問儲存在Hologres中的資料時,MaxCompute支援使用外部表格訪問Hologres資料來源資料,無需匯入資料至MaxCompute中,實現快速查詢Hologres資料。本文為您介紹如何在外部表格建表語句中指定Hologres資料來源、STS認證資訊或開啟雙簽名開關、映射目標表、JDBC驅動資訊,來建立Hologres外部表格。

背景資訊

Hologres是相容PostgreSQL協議的即時互動式分析資料倉庫,在底層與MaxCompute無縫串連。

您可以使用在MaxCompute上建立Hologres外部表格的方式,基於PostgreSQL JDBC驅動及STS認證資訊查詢Hologres資料來源的資料。該方式無冗餘儲存,無需匯入匯出資料,可實現快速擷取查詢結果。

前提條件

建立Hologres外部表格前,請確認已經滿足如下條件:

  • 已準備好Hologres資料庫及目標表。

    建立Hologres資料庫資訊,請參見建立資料庫

    建立Hologres表資訊,請參見建表概述

    假設已準備好的Hologres執行個體資訊如下:

    • Hologres資料庫名稱:mc_test

    • Hologres資料庫的Schema:public

    • Hologres資料庫傳統網路串連地址:hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80

    • Hologres表名稱:holo。表資料如下:表資料

  • 已準備好待建立Hologres外部表格的目標MaxCompute專案。

    建立MaxCompute專案資訊,請參見建立MaxCompute專案

  • 已安裝MaxCompute用戶端。

    更多安裝MaxCompute用戶端操作,請參見安裝並配置MaxCompute用戶端

使用限制

Hologres外部表格的使用限制如下:

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

  • Hologres的分區表和MaxCompute的分區表沒有對應關係。Hologres外部表格不支援分區。

  • 當您需要向Hologres外部表格寫入大量資料時,採用並行多進程寫入方式,會小機率出現某個寫入進程資料重寫情況,導致資料重複。

  • MaxCompute裡建的Hologres外部表格,其中DECIMAL資料類型預設小數18位,不能修改,只能建成decimal(38,18)。如果小數位元比較少,可以在MaxCompute中建外部表格時資料類型選擇String,使用的時候再使用cast函數強制轉換後使用。

  • MaxCompute建立的Hologres外部表格,不支援Array,Map,Struct複雜資料類型。

  • 在MaxCompute建立Hologres外部表格時,Hologres中有的JSON、JSONB、MONEY等資料類型,目前在MaxCompute沒有對應的資料類型,暫時不支援。

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

注意事項

Hologres外部表格使用過程中需要注意:

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

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

  • 建表時,表名和欄位名大小寫不敏感。在查詢表或欄位時,無需區分大小寫,且不支援強制轉換大小寫。

建立Hologres外部表格文法

在建立外部表格時,您需要在建表DDL語句中指定StorageHandler,並配置STS認證資訊(或開啟雙簽名開關)、JDBC串連地址實現訪問Hologres資料來源。建表語句定義如下。

  • STS模式建立Hologres外部表格。

    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'='<col1:column1,col2:column2,col3:column3,...>']
    );
  • 雙簽名模式建立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'='<col1:column1,col2:column2,col3:column3,...>']
    );
  • odps.sql.common.table.planner.ext.hive.bridge:通過雙簽名模式建立Hologres外部表格必填;通過STS模式建立Hologres外部表格不填。雙簽名開關,值設定為true,表示開啟雙簽名開關,通過雙簽名模式建立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外部表格必填;通過雙簽名模式建立Hologres外部表格不填。指定RAM角色的ARN資訊,用於建立外部表格時STS認證資訊的填寫。您可以在RAM存取控制頁面,單擊目標RAM角色名稱後,在基本資料地區擷取。

  • location:必填。Hologres執行個體的JDBC串連地址。其中:

    • endpoint:必填。Hologres執行個體的傳統網路網域名稱。擷取方式,請參見執行個體配置

    • port:必填。Hologres執行個體的網路連接埠。擷取方式,請參見執行個體配置擷取endpoint和連接埠

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

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

    • schema:可選。如果表名在Hologres資料庫內是唯一的,或源表是預設Schema中的表,可以不配置該屬性。更多Schema資訊,請參見CREATE SCHEMA

    • holo_table_name:必填。Hologres源表名稱。更多Hologres源表資訊,請參見建表概述查看錶

  • 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欄位名稱添加雙引號("")。格式為:MaxCompute欄位1 : "Hologres欄位1" [,MaxCompute欄位2 : "Hologres欄位2" ,...]

建立Hologres外部表格(STS模式)

通過STS模式建立Hologres外部表格的步驟如下:

  1. 建立RAM角色

    建立RAM角色擷取ARN資訊,用於建立外部表格時填寫STS認證資訊。

    1. 登入RAM存取控制建立RAM角色。

      建立RAM角色建立RAM角色的可信實體類型根據實際需求選擇阿里雲帳號或者身份供應商。

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

      1. 角色頁面,單擊已建立完成的RAM角色名稱。

      2. 單擊信任策略頁簽。

      3. 信任策略頁簽,單擊編輯信任策略

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

        修改信任策略配置內容與選擇的可信實體類型相關。

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

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

          <UID>即阿里雲帳號ID,可在使用者資訊頁面擷取。

      5. 單擊確定

  2. 添加RAM角色至Hologres執行個體並授權

    RAM角色需要有Hologres執行個體的開發許可權,才能在許可權範圍內使用Hologres。由於RAM角色預設沒有Hologres管理主控台的查看和操作執行個體的許可權,因此需要阿里雲帳號完成RAM相關許可權授予才能進行後續操作。添加RAM角色至Hologres執行個體,您可以通過如下方式進行授權。

    • 通過Hologres管理主控台授權。

      1. 登入Hologres管理主控台

      2. 在左側導覽列單擊執行個體列表,單擊需要授權的Hologres執行個體名稱。

      3. 在執行個體詳情頁面,單擊帳號管理

      4. 使用者管理頁面單擊新增使用者添加RAM角色至Hologres執行個體。新增使用者

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

    • 通過SQL方式授權。

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

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

  3. 建立Hologres外部表格

    完成上述步驟後,基於已準備好的資料資訊,您即可登入MaxCompute用戶端,結合建立Hologres外部表格文法建立Hologres外部表格。

    1. 安裝並登入MaxCompute本地用戶端,進入目標MaxCompute專案。

      進入目標專案命令資訊,請參見專案空間操作

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

      命令樣本如下。

      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/aliyunodpsholorole')
      location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/mc_test?ApplicationName=MaxCompute&currentSchema=public&useSSL=false&table=holo/'
      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;
      --查詢Hologres外部表格資料。
      select * from my_table_holo_jdbc limit 10;

      返回結果如下。

      +------------+------------+
      | id         | name       |
      +------------+------------+
      | 1          | kate       |
      | 2          | mary       |
      | 3          | bob        |
      | 4          | tom        |
      | 5          | lulu       |
      | 6          | mark       |
      | 7          | haward     |
      | 8          | lilei      |
      | 9          | hanmeimei  |
      | 10         | lily       |
      +------------+------------+
    4. 可選:基於Hologres外部表格與Hologres進行資料交換、聯合分析。

      例如,將MaxCompute加工後的資料利用Hologres外部表格,寫入Hologres實現加速分析、線上服務。命令樣本如下。

      --訪問Hologres外部表格需要添加如下屬性。
      set odps.sql.split.hive.bridge=true;
      set odps.sql.hive.compatible=true;
      --向Hologres外部表格插入資料。
      insert into my_table_holo_jdbc values (12,'alice');
      --查詢Hologres外部表格資料。
      select * from my_table_holo_jdbc;

      返回結果如下。

      +------------+------------+
      | id         | name       |
      +------------+------------+
      | 12          | alice      |
      | 1          | kate       |
      | 2          | mary       |
      | 3          | bob        |
      | 4          | tom        |
      | 5          | lulu       |
      | 6          | mark       |
      | 7          | haward     |
      | 8          | lilei      |
      | 9          | hanmeimei  |
      | 10         | lily       |
      | 11         | lucy       |
      +------------+------------+

      頻繁更新的維度資料表儲存在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      |
      +------------+------------+------------+------------+
      | 1          | kate       | 1          | kate       |
      | 2          | mary       | 2          | mary       |
      | 3          | bob        | 3          | bob        |
      | 4          | tom        | 4          | tom        |
      | 5          | lulu       | 5          | lulu       |
      | 6          | mark       | 6          | mark       |
      | 7          | harward    | 7          | harward    |
      | 8          | lilei      | 8          | lilei      |
      | 9          | hanmeimei  | 9          | hanmeimei  |
      | 10         | lily       | 10         | lily       |
      | 11         | lucy       | 11         | lucy       |
      | 12         | alice      | 12         | alice      |
      +------------+------------+------------+------------+

建立Hologres外部表格(雙簽名模式)

雙簽名是MaxCompute和Hologres共同研發的認證及鑒權協議,在MaxCompute側使用帳號登入資訊加簽名後,把認證資料傳遞給Hologres側,Hologres根據MaxCompute底層達成的協議,進行同名認證及鑒權。這樣只需要在MaxCompute和Hologres有相同的帳號,就可以直接進行外部表格訪問,不需要額外設定認證資訊。

  • 前提條件。

    Hologres中存在跟MaxCompute相同名稱的帳號,並且該帳號具有Hologres中對應表的讀寫權限。

  • 使用限制。

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

  • 命令樣本。

    您可直接登入MaxCompute用戶端,結合建立Hologres外部表格文法通過雙簽名模式建立Hologres外部表格。

    --建立外部表格
    CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl
    (
      id int,
      name string,
      ds string
    )
    STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
    location 'jdbc:postgresql://hgprecn-cn-zvp2o6aq****-cn-beijing-internal.hologres.aliyuncs.com:80/mc_test?ApplicationName=MaxCompute&currentSchema=public&preferQueryMode=simple&useSSL=false&table=mf_holo_mc_up/'
    TBLPROPERTIES (
      'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
      'odps.federation.jdbc.target.db.type'='holo',
      'odps.federation.jdbc.colmapping'='id:id,name:name,ds:ds'
    );
    
    --查詢外部表格(必須與開啟雙簽名開關命令一起執行)
    set odps.sql.common.table.planner.ext.hive.bridge=true;
    select * from holo_mc_external_dbl;

開啟Hologres外部表格儲存直讀功能

背景介紹

MaxCompute對Hologres外部表格的讀是通過走JDBC模式,目前版本支援MaxCompute直讀Hologres儲存層,能夠帶來以下優勢:

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

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

使用限制

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

  • 依賴Hologres執行個體版本 : V1.3.34及以上版本。

    Hologres版本低於V1.3.34不支援直讀功能。

  • 由於網路連通性,只支援同Region的MaxCompute訪問Hologres執行個體。

    目前不支援跨Region訪問,跨Region訪問會報錯:FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3

  • 不支援直讀Hologres冷存表。

  • 目前直讀功能不支援Hologres行存表。

  • 當Hologres配置為主從架構,僅支援配置串連URL為主執行個體,不支援配置為從執行個體。

  • 直讀功能會對MaxCompute與Hologres之間的列進行類型校正,當出現不匹配的類型時會自動回退為JDBC模式執行。MaxCompute建立Hologres外部表格時,資料類型的限制如下:

    • JDBC模式與MaxCompute直讀模式都不支援的資料類型:

      • 不支援Array、Map、Struct複雜資料類型。

      • 不支援JSON、MONEY等資料類型。

    • JDBC模式支援,而MaxCompute直讀模式不支援的資料類型:

      • BINARY類型。

    • MaxCompute直讀模式支援,而JDBC模式不支援的資料類型:

      • JSONB資料類型

    • 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直讀模式使用Timestamp類型映射Hologres中的Timestamp With Time Zone類型不僅會存在細微的時間誤差,還會存在時區位移,例如:

        • 以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

    • 其他資料類型映射如下:

      Hologres資料類型

      MaxCompute資料類型

      說明

      TEXT

      • STRING

      • VARCHAR

      不涉及

      SMALLINT

      SMALLINT

      不涉及

      • INT

      • INT4

      • INTEGER

      INT

      不涉及

      • INT8

      • BIGINT

      BIGINT

      不涉及

      • FLOAT4

      • REAL

      FLOAT

      不涉及

      • FLOAT

      • FLOAT8

      DOUBLE

      不涉及

      • BOOL

      • BOOLEAN

      BOOLEAN

      不涉及

      TIMESTAMP

      TIMESTAMP

      儲存精度為微秒,存在時區的時間誤差。

      TIMESTAMP WITH TIME ZONE

      TIMESTAMP

      MaxCompute與Hologres在底層已經進行了精度轉換。MaxCompute輸出不包含時區格式。

      NUMERIC

      DECIMAL

      MaxCompute的DECIMAL如果未指定精度,則預設為(38,18),使用IMPORT FOREIGN SCHEMA語句建立表時系統會自動轉換精度。

      CHAR(n)

      CHAR(n)

      MaxCompute的CHAR(n)為固定長度字元類型,n為長度。最大取值為255。長度不足則使用空格填充。

      VARCHAR(n)

      VARCHAR(n)

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

      DATE

      DATE

      不涉及

  • Foreign Server模式存在的額外限制:MaxCompute Project需要開啟三層模型。

開啟方式

在MaxCompute中查詢Hologres外部表格時SQL前加上如下參數。

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

直讀驗證

可以在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外部表格為分區表導致,目前暫不支援。

  • Select hg_version errorHologres version check errorFetch hg_version data error:Hologres執行個體版本有誤導致的,需要升級Hologres執行個體版本到V1.3.34或以上版本,升級執行個體版本詳情請參見執行個體升級