全部產品
Search
文件中心

AnalyticDB:使用OSS Foreign Table訪問Iceberg資料

更新時間:Jun 20, 2025

本文介紹如何在AnalyticDB for PostgreSQL中,通過OSS FDW(Foreign Data Wrapper)訪問Apache Iceberg資料。

背景資訊

Apache Iceberg是一種開放的表格式,用於超大規模的分析資料集。它提供了版本控制、Schema演化、分區演化和高效查詢等特性。通過AnalyticDB for PostgreSQL提供的Iceberg支援,您可以:

  • 直接存取Iceberg表中的資料,無需匯入。

  • 利用AnalyticDB for PostgreSQL的MPP架構來加速分析Iceberg資料。

  • 將本地表和Iceberg表進行關聯查詢、分析等。

  • 與支援Iceberg的其他資料系統(如開源巨量資料元件Hive、Spark、StarRocks以及雲上EMR等)之間實現無縫資料共用。

版本限制

核心版本為7.3.0.0及以上的AnalyticDB for PostgreSQL7.0版執行個體。

說明

您可以在控制台執行個體的基本資料頁查看核心小版本。如不滿足上述版本要求,需要您升級核心小版本

前提條件

  • 使用阿里雲帳號或具備AliyunGPDBFullAccessAliyunECSFullAccessAliyunEMRFullAccessAliyunOSSFullAccess許可權的RAM使用者,並為其建立AccessKey ID和AccessKey Secret

  • AnalyticDB for PostgreSQL執行個體和OSS儲存空間Bucket位於同一地區。

  • EMR叢集AnalyticDB for PostgreSQL執行個體位於同一VPC。

    說明

    除了EMR叢集外,您也可以使用其他工具(如Flink、StarRocks、Doris等)寫入Iceberg資料。

  • Iceberg表和資料已存在於OSS Bucket。

使用限制

  • 確保AnalyticDB for PostgreSQL執行個體能夠訪問Iceberg的儲存系統和中繼資料服務。AnalyticDB for PostgreSQL支援以下儲存系統和中繼資料服務。

    • 儲存系統:支援阿里雲Object Storage Service。暫不支援OSS-HDFS儲存和外部HDFS儲存。

    • 中繼資料服務:Hive Metastore(以下簡稱HMS)以及基於目錄的Hadoop Catalog,其中HMS的串連地址應該為同一地區的內網地址,確保AnalyticDB for PostgreSQL的協調節點與HMS之間的網路暢通。

  • 當前僅支援Iceberg表的查詢,暫不支援INSERTUPDATEDELETE等修改操作。

  • 僅支援Iceberg表底層檔案格式為ORC和Parquet。

步驟一:建立OSS Server

使用以下SQL建立OSS Server,指定需要訪問的OSS服務端資訊。

文法

CREATE SERVER <server_name>
    FOREIGN DATA WRAPPER <fdw_name>
    OPTIONS (
        endpoint '<endpoint_name>',  -- OSS地區節點,請替換為實際使用的地區
        bucket '<bucket_name>',      -- OSS Bucket名稱
        catalog_type '<catalog_name>', -- Iceberg catalog類型
        CatalogParams
    );

參數說明

參數

類型

是否必填

說明

server_name

字串

OSS Server的名稱。

fdw_name

字串

管理伺服器的外部資料容器的名稱,固定為oss_fdw。

OPTIONS參數選項請參見下表。

參數名稱

參數類型

是否必填

描述

endpoint

字串

訪問網域名稱,即訪問OSS的入口。AnalyticDB for PostgreSQL僅支援配置內網網域名稱。詳情請參見OSS地區和訪問網域名稱公用雲小節。

bucket

字串

資料檔案所屬的Bucket的名稱,擷取方法請參見準備工作

說明
  • OSS Server和OSS FDW中必須有一個設定了Bucket。關於OSS FDW的Bucket相關資訊,請參見建立OSS FDW

  • 如果OSS Server和OSS FDW都設定了Bucket,則OSS FDW中的Bucket生效。

catalog_type

字串

Iceberg Catalog的類型,取值如下:

  • hive:用於訪問Hive Catalog。

  • hadoop:用於訪問Hadoop Catalog。

  • onemeta:用於訪問DMS OneMeta Catalog。

重要

推薦您使用hive或hadoop。如需使用onemeta,請提交工單聯絡支援人員將Iceberg資料寫入DMS OneMeta。

CatalogParams

hms_uris

字串

Hive MetaStore的URL,用於訪問Hive Catalog。格式為thrift://<metastore-host>:<port>

  • metastore-host為Hive Metastore服務的主機名稱或內網IP地址。

  • port為Hive Metastore服務的連接埠號碼,預設為9083。

重要
  • 配置該參數前,請確保AnalyticDB for PostgreSQL執行個體的master節點可以訪問HMS,例如已為EMR叢集master節點所屬的ECS的安全性群組添加9083連接埠的入方向規則。

  • 如果您的EMR叢集中Hive MetaStore開啟了高可用模式,此處可以填寫多個HMS地址並用逗號分隔。例如:"thrift://<HMS IP地址1>:<HMS連接埠號碼1>,thrift://<HMS IP地址2>:<HMS 連接埠號碼2>,thrift://<HMS IP地址3>:<HMS連接埠號碼3>"

warehouse

字串

Iceberg資料倉儲的OSS路徑,用於訪問Hadoop Catalog。

dms_endpoint

字串

阿里雲DMS Endpoint,用於訪問DMS OneMeta。您可根據服務存取點擷取Endpoint與地區的對應關係。

dms_region

字串

阿里雲DMS地區ID,用於訪問DMS OneMeta。在DMS控制台點擊對應Catalog執行個體地區對應的地區ID

更多詳情請參見使用OSS Foreign Table進行資料湖分析

步驟二:建立OSS User Mapping

建立OSS Server後,您還需要建立一個訪問OSS Server的使用者。您可以使用CREATE USER MAPPING語句建立OSS User Mapping,用於定義AnalyticDB PostgreSQL版資料庫使用者與訪問OSS Server使用者的映射關係。更多介紹,請參見CREATE USER MAPPING

文法

CREATE USER MAPPING FOR {username | USER | CURRENT_USER | PUBLIC}
    SERVER <server_name>
    OPTIONS (
        id '<AccessKey ID>',               -- 訪問OSS的AccessKey ID
        key '<AccessKey Secret>'           -- 訪問OSS的AccessKey Secret
        dms_id '<AccessKey ID>',           -- 訪問DMS的AccessKey ID
        dms_key '<AccessKey Secret>'       -- 訪問DMS的AccessKey Secret
    );

參數說明

參數

類型

是否必填

說明

username

字串

是,四選一

指定映射的AnalyticDB PostgreSQL版執行個體的使用者名稱。

USER

字串

映射當前的AnalyticDB PostgreSQL版執行個體的使用者名稱。

CURRENT_USER

字串

PUBLIC

字串

匹配所有AnalyticDB PostgreSQL版執行個體的使用者名稱,包括以後建立的使用者。

server_name

字串

OSS Server的名稱。

OPTIONS參數選項請參見下表。

參數

類型

是否必填

說明

id

字串

AccessKey ID,擷取方法,請參見建立AccessKey

key

字串

AccessKey Secret,擷取方法,請參見建立AccessKey

dms_id

字串

用於訪問DMS OneMeta的AccessKey ID,可與本表格參數id共用同一個AccessKey ID。僅在需要訪問DMS OneMeta時配置該參數。

dms_key

字串

用於訪問DMS OneMeta的AccessKey Secret,可與本表格參數key共用同一個AccessKey Key。僅在需要訪問DMS OneMeta時配置該參數。

步驟三:建立OSS FDW

擁有OSS Server和訪問OSS Server的使用者後,您可以開始建立OSS FDW。您可以使用CREATE FOREIGN TABLE語句建立OSS FDW,映射到Iceberg表。

重要

Iceberg的基礎資料型別 (Elementary Data Type)會自動對應到AnalyticDB for PostgreSQL的資料類型,如BIGINT映射到bigint,STRING映射到text等。為了建立外表時確保類型相容,您可查看OSS Foreign Table資料類型對照表擷取更多映射類型詳情。

文法

CREATE FOREIGN TABLE <table_name> (
    <column_name> <data_type>
    [,...]
  )
    SERVER <server_name>
    OPTIONS (
        format 'iceberg',                 -- 指定格式為Iceberg
        dms_catalog_name '<dms-catalog-name>', --DMS Onemeta Catalog 名稱
        database_name '<database_name>',  -- Iceberg資料庫名
        table_name '<iceberg_table_name>' -- Iceberg表名    
);

參數說明

參數名稱

類型

是否必填

說明

table_name

字串

OSS FDW名稱。

column_name

字串

列名。

data_type

字串

該列的資料類型。

server_name

字串

OSS Server的名稱。

OPTIONS參數選項請參見下表。

參數

類型

是否必填

說明

format

字串

此處設定為iceberg,表示使用Iceberg格式。

dms_catalog_name

字串

DMS Onemeta Catalog名稱,僅在需要訪問DMS OneMeta時配置該參數。您可以在DMS控制台點擊對應Catalog執行個體查看。

database_name

字串

目標Iceberg表所在的database名稱,OSS上的完整路徑為oss://<BucketName>/<path-to-warehouse>/<database_name>

table_name

字串

目標Iceberg表的名稱,OSS上的完整路徑為oss://<BucketName>/<path-to-warehouse>/<database_name>/<table_name>

步驟四:訪問Iceberg資料

建立OSS Foreign Table後,您可以像查詢普通表一樣查詢Iceberg資料。

SELECT * FROM <iceberg_table_name>;
SELECT COUNT(*) FROM <iceberg_table_name>;

使用樣本

本章節示範如何在AnalyticDB for PostgreSQL中訪問Iceberg資料。

樣本一:訪問EMR的Iceberg資料(Hadoop Catalog)

步驟一:登入EMR執行個體

使用SSH方式登入EMR叢集

步驟二:登入Spark SQL

執行以下命令,通過Spark SQL讀寫Iceberg配置。

spark-sql       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
                --conf spark.sql.catalog.hadoop=org.apache.iceberg.spark.SparkCatalog \
                --conf spark.sql.catalog.hadoop.type=hadoop \
                --conf spark.sql.catalog.hadoop.warehouse=oss://testBucketName/warehouse
說明

請將--conf spark.sql.catalog.hadoop.warehouse=oss://testBucketName/warehouse中的OSS路徑替換為實際OSS路徑。

當出現如下資訊時,表示已進入spark-sql命令列。

spark-sql>

步驟三:建立Iceberg表並寫入資料

建立hadoop資料庫。

CREATE DATABASE IF NOT EXISTS hadoop.hadoop_db;

建立測試表並寫入資料。

-- 建立測試表
CREATE TABLE IF NOT EXISTS hadoop.hadoop_db.hadoop_sample(
    id BIGINT COMMENT 'unique id', 
    data STRING
) 
    USING iceberg;
-- 寫入資料
INSERT INTO hadoop.hadoop_db.hadoop_sample VALUES (1, 'a'), (2, 'b'), (3, 'c');

查詢資料。

SELECT * FROM hadoop.hadoop_db.hadoop_sample;

步驟四:驗證OSS檔案結構

登入OSS控制台,在目標Bucket中確認Iceberg中繼資料及資料檔案結構如下。

oss://testBucketName/warehouse/hadoop_db/hadoop_sample/  
├── metadata/
│   ├── metadata.json  
│   ├── snapshots.avro  
│   └── manifests.avro
└── data/  
    └── parquet files...

步驟五:建立Iceberg外表

根據EMR建立的Iceberg表結構,在AnalyticDB for PostgreSQL執行以下SQL建立Iceberg外表。

-- 建立OSS SERVER
CREATE SERVER oss_hadoop_srv
    FOREIGN DATA WRAPPER oss_fdw
    OPTIONS (
        endpoint 'oss-cn-hangzhou-********.aliyuncs.com', 
        bucket 'testBucketName',
        catalog_type 'hadoop',
        warehouse 'oss://testBucketName/warehouse'
  );
-- 建立OSS User Mapping
CREATE USER MAPPING FOR PUBLIC
    SERVER oss_hadoop_srv
    OPTIONS (
        id 'LTAI****************',           -- 訪問OSS的AccessKey ID
        key 'yourAccessKeySecret'       -- 訪問OSS的AccessKey Secret
  );
-- 建立OSS FDW
CREATE FOREIGN TABLE sample (
    id BIGINT,
    data text
  )
    SERVER oss_hadoop_srv 
    OPTIONS (
        format 'iceberg',
        database_name 'hadoop_db',
        table_name 'hadoop_sample'
  );

步驟六:執行聯邦查詢

使用如下SQL查詢資料。

SELECT * FROM sample;

樣本二:訪問EMR的Iceberg資料(Hive Catalog)

步驟一:登入EMR執行個體

使用SSH方式登入EMR叢集

步驟二:登入Spark SQL

執行以下命令,通過Spark SQL讀寫Iceberg配置。

spark-sql       --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
                --conf spark.sql.catalog.hive=org.apache.iceberg.spark.SparkCatalog \
                --conf spark.sql.catalog.hive.type=hive

當出現如下資訊時,表示已進入spark-sql命令列。

spark-sql>

步驟三:建立Iceberg表並寫入資料

建立hive資料庫。

CREATE DATABASE IF NOT EXISTS hive.hive_db
    COMMENT '資料庫儲存在OSS上'
    LOCATION 'oss://testBucketName/warehouse/hive_db.db/';

建立測試表並寫入資料。

-- 建立測試表
CREATE TABLE IF NOT EXISTS hive.hive_db.hive_sample(
    id BIGINT COMMENT 'unique id', 
    data STRING
) 
    USING iceberg;
-- 寫入資料
INSERT INTO hive.hive_db.hive_sample VALUES (1, 'a'), (2, 'b'), (3, 'c');

查詢資料。

SELECT * FROM hive.hive_db.hive_sample;

步驟四:驗證OSS儲存結構

登入OSS控制台,在目標Bucket中確認Iceberg中繼資料及資料檔案結構如下。

oss://testBucketName/warehouse/hive_db.db/hive_sample/ 
├── metadata/
│   ├── metadata.json  
│   ├── snapshots.avro  
│   └── manifests.avro
└── data/  
    └── parquet files...

步驟五:建立Iceberg外表

根據EMR建立的Iceberg表結構,在AnalyticDB for PostgreSQL執行以下SQL建立Iceberg外表。

-- 建立OSS SERVER
CREATE SERVER oss_hive_srv
    FOREIGN DATA WRAPPER oss_fdw
    OPTIONS (
        endpoint 'oss-cn-hangzhou-********.aliyuncs.com', 
        bucket 'testBucketName',
        catalog_type 'hive',
        hms_uris 'thrift://192.168.XXX.XXX:9083'
);
-- 建立OSS User Mapping
CREATE USER MAPPING FOR PUBLIC
    SERVER oss_hive_srv
    OPTIONS (
        id 'LTAI****************',           -- 訪問OSS的AccessKey ID
        key 'yourAccessKeySecret'       -- 訪問OSS的AccessKey Secret
    );
-- 建立OSS FDW
CREATE FOREIGN TABLE hive_sample(
    id BIGINT,
    data text
)
    SERVER oss_hive_srv OPTIONS (
        format 'iceberg',
        database_name 'hive_db',
        table_name 'hive_sample'
);

步驟六:執行聯邦查詢

使用如下SQL查詢資料。

SELECT * FROM hive_sample;

樣本三:訪問DMS OneMeta的Iceberg資料

重要

如需使用DMS OneMeta Catalog,請提交工單聯絡支援人員將Iceberg資料寫入DMS OneMeta。

步驟一:建立Iceberg外表

根據DMS OneMeta中建立的Iceberg表結構,在AnalyticDB for PostgreSQL執行以下SQL建立Iceberg外表。

-- 建立SERVER
CREATE SERVER oss_dms_serv
    FOREIGN DATA WRAPPER oss_fdw
    OPTIONS (
        endpoint 'oss-cn-hangzhou-********.aliyuncs.com',
        bucket 'testBucketName',
        catalog_type 'onemeta',
        dms_endpoint '<dms_endpoint_name>',
        dms_region '<dms_region_id>'
  );
-- 建立OSS User Mapping
CREATE USER MAPPING FOR PUBLIC
    SERVER oss_dms_serv
    OPTIONS ( 
        id 'LTAI****************',           -- 訪問OSS的AccessKey ID
        key 'yourAccessKeySecret',       -- 訪問OSS的AccessKey Secret
        dms_id 'LTAI****************',       -- 訪問DMS的AccessKey ID
        dms_key 'yourAccessKeySecret'   -- 訪問DMS的AccessKey Secret
    );
-- 建立外表
CREATE FOREIGN TABLE sample(
    id BIGINT,
    data text
)
    SERVER oss_dms_serv OPTIONS (
        format 'iceberg',
        dms_catalog_name '<dms-catalog-name>',
        database_name '<dms-database-name>',
        table_name '<dms-table-name>'
);

步驟二:執行聯邦查詢

使用如下SQL查詢資料。

SELECT * FROM sample;

常見問題

Iceberg表中的資料類型如何映射到AnalyticDB for PostgreSQL

Iceberg的基礎資料型別 (Elementary Data Type)會自動對應到AnalyticDB for PostgreSQL的資料類型,如BIGINT映射到bigint,STRING映射到text等。為了建立外表時確保類型相容,您可查看OSS Foreign Table資料類型對照表擷取更多映射類型詳情。

能否對Iceberg外表進行寫入操作?

不能。AnalyticDB for PostgreSQL僅支援查詢Iceberg外表。

如果Iceberg表所在Schema變更怎麼辦?

當Iceberg表所在的Schema發生變更時,需要重新建立AnalyticDB for PostgreSQL中的外表DDL以反映最新的表結構。