全部產品
Search
文件中心

AnalyticDB:CREATE EXTERNAL TABLE

更新時間:Jul 17, 2026

AnalyticDB for MySQL支援建立多種外表,包括:OSS外表、RDS MySQL外表、MongoDB外表、Tablestore外表、MaxCompute外表。

前提條件

注意事項

跨帳號僅支援建立OSS外表。

OSS外表

重要
  • OSS Bucket需要與AnalyticDB for MySQL叢集位於同一地區。

  • 建立Hudi外表和Iceberg外表、Paimon外表時,叢集核心版本需滿足如下要求:

    • Hudi外表:叢集核心版本需為3.1.9.2及以上。

    • Iceberg外表:叢集核心版本需為3.2.3.0及以上。

    • Paimon外表:叢集核心版本需為3.2.6.1及以上。

    雲原生資料倉儲AnalyticDB MySQL控制台集群信息頁面,配寘資訊地區,查看和升級核心版本

  • 建立OSS分區外表後,請執行MSCK REPAIR TABLE語句同步外表的分區,否則將無法查詢到外表資料。

  • 如果您需要跨帳號建立OSS外表,請在建立外部資料庫時,添加對應參數。詳細資料,請參見CREATE EXTERNAL DATABASE

文法

CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
[PARTITIONED BY (column_name column_type[, …])]
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS {TEXTFILE|ORC|PARQUET|JSON|RCFILE|HUDI|ICEBERG|PAIMON}
LOCATION 'OSS_LOCATION';
[TBLPROPERTIES (
 'type' = 'cow|mor'
 'auto.create.location' = 'true|false')
 'metadata_location' = 'METADATA_LOCATION')]

參數說明

參數

是否必填

說明

table_name (column_name column_type[, …])

定義表名和表結構。

表名和列名的命名規則,請參見命名約束

重要

建立Paimon外表時,表名、列名、欄欄位類型需要和Paimon檔案相同,當表結構(欄位名字或者類型)與Paimon不一致時,以Paimon自身的表結構為準。

PARTITIONED BY (column_name column_type[, …])

建立分區外表時,需要配置該參數指定分區列。指定多個分區列,表示建立多級分區表。

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

指定資料行分隔符號。您可以指定任意符號,但需和檔案中的分隔字元一致。本文以英文逗號(,)為例。

重要

STORED AS TEXTFILESTORED AS JSON時,支援配置該參數。

STORED AS {TEXTFILE|ORC|PARQUET|JSON|RCFILE|HUDI|ICEBERG}

指定檔案格式。

如果檔案是.txt或.csv格式,請配置為STORED AS TEXTFILE

PARQUET格式的檔案支援STRUCT資料類型,且支援嵌套。

重要

僅3.1.8.0及以上核心版本的叢集支援STRUCT資料類型的PARQUET格式檔案。

LOCATION

指定OSS檔案或目錄所在的路徑。

指定OSS目錄的路徑時,請遵循以下規則,否則可能導致查詢失敗或結果異常。

  • 目錄的路徑以/結尾。

  • 目錄中所有檔案的檔案格式相同。

  • 目錄中所有檔案的欄位數量、欄位順序、欄位類型相同。

建立分區外表時,請指定LOCATION為分區的上一級目錄。例如,OSS檔案的路徑為oss://testBucketname/testfolder/p1=2023-06-13/data.csv。此時需指定LOCATION 'oss://testBucketname/testfolder/',才能建立出p1為分區列的分區外表。

重要
  • 建立Hudi外表時,需確保該路徑下存在Hudi中繼資料檔案,即.hoodie檔案。

  • 如果您已配置了auto.create.location=true,當建立分區外表所指定的LOCATION路徑不存在時,會自動建立OSS目錄。

type

Hudi外表的類型,取值:

  • COW(預設值):適用於對讀取效率要求高的情境。

  • MOR:適用於對寫入效率要求高的情境。

重要

僅當STORED AS HUDI時,需要填寫該參數。

auto.create.location

是否自動建立OSS檔案或目錄所在的路徑。取值:

  • true:是。

  • false(預設值):否。

重要

該參數僅在建立分區外表時生效。

metadata_location

指定Iceberg外表的Metadata檔案的路徑。

重要
  • 僅當STORED AS ICEBERG時,需要填寫該參數。

  • 請使用最新的Metadata檔案,以確保查詢到的是最新資料。

樣本

樣本1:建立非分區外表

  • 指定檔案儲存體格式為TEXTFILE

    CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest1
    (id INT,
    name STRING,
    age INT,
    city STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY  ','
    STORED AS TEXTFILE
    LOCATION  'oss://testBucketName/osstest/p1=hangzhou/p2=2023-06-13/data.csv';
  • 指定檔案儲存體格式為HUDI

    CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest2
    (id INT,
    name STRING,
    age INT,
    city STRING)
    STORED AS HUDI
    LOCATION  'oss://testBucketName/osstest/test'
    TBLPROPERTIES ('type' = 'cow');
  • 指定檔案儲存體格式為PARQUET

    CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest3
    (
    A STRUCT < var1:STRING, var2:INT >) 
    STORED AS PARQUET 
    LOCATION 'oss://testBucketName/osstest/Parquet';
  • 指定檔案儲存體格式為ICEBERG

    CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest4
    (
    user_id BIGINT)  
    STORED AS ICEBERG  
    LOCATION 'oss://testBucketName/osstest/no_partition_table/' 
    TBLPROPERTIES (metadata_location='oss://testBucketName/osstest/no_partition_table/metadata/00000-a32d6136-8490-4ad2-ada3-fe2f7204199f.metadata.json');
  • 指定檔案儲存體格式為PAIMON

    CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest5
    (
    a INT,
    b BIGINT,
    aCa STRING, 
    d VARCHAR(1))
    STORED AS PAIMON 
    LOCATION 'oss://testBucketName/osstest/default.db/t1/';

樣本2:建立分區外表

CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest6
(id int,
name string,
age int,
city string)
PARTITIONED BY (p2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY  ','
STORED AS TEXTFILE
LOCATION  'oss://testBucketName/osstest/p1=hangzhou/';

樣本3:建立多級分區外表

CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest7
(id int,
name string,
age int,
city string)
PARTITIONED BY (p1 string,p2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY  ','
STORED AS TEXTFILE
LOCATION  'oss://testBucketName/osstest/';

RDS MySQL外表

重要
  • 建立RDS MySQL外表,請提前在AnalyticDB MySQL控制台集群信息頁面開啟ENI開關。開啟和關閉ENI網路會導致資料庫連接中斷大約2分鐘,無法讀寫。請謹慎評估影響後再開啟或關閉ENI網路。

  • RDS MySQL執行個體需要AnalyticDB for MySQL叢集位於同一VPC。

文法

CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='MYSQL'
TABLE_PROPERTIES='{  
	"url":"mysql_vpc_address",  
	"tablename":"mysql_table_name",  
	"username":"mysql_user_name",  
	"password":"mysql_user_password"
	[,"charset":"{gbk|utf8|utf8mb4}"]
  }';

參數說明

參數

是否必填

說明

table_name (column_name column_type[, …])

定義表名和表結構。

表名和列名的命名規則,請參見命名約束

ENGINE='MYSQL'

外表的儲存引擎。讀寫RDS MySQL資料時,取值為MYSQL。

TABLE_PROPERTIES

外表屬性。

url

RDS MySQL執行個體的內網地址、連接埠號碼和資料庫名。如何擷取RDS的內網地址,請參見查看或修改內外網地址和連接埠

tablename

RDS MySQL的表名稱。

username

RDS MySQL資料庫的帳號。

password

RDS MySQL資料庫帳號的密碼。

charset

MySQL外表字元集,取值說明:

  • gbk

  • UTF8(預設值)

  • utf8mb4

樣本

CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mysqltest (
	id int,
	name varchar(1023),
	age int
 ) ENGINE = 'MYSQL'
 TABLE_PROPERTIES = '{
   "url":"jdbc:mysql://rm-bp1gx6********.mysql.rds.aliyuncs.com:3306/test_adb",
   "tablename":"person",
   "username":"testUserName",
   "password":"testUserPassword",
   "charset":"utf8"
}';

MongoDB外表

重要
  • 建立MongoDB外表,請提前在AnalyticDB MySQL控制台集群信息頁面開啟ENI開關。開啟和關閉ENI網路會導致資料庫連接中斷大約2分鐘,無法讀寫。請謹慎評估影響後再開啟或關閉ENI網路。

  • MongoDB外表執行個體需要與AnalyticDB for MySQL叢集位於同一VPC。

文法

CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='MONGODB'
TABLE_PROPERTIES = '{
	"mapped_name":"table",
  "location":"location",
  "username":"user",
  "password":"password",
}';

參數說明

參數

是否必填

說明

table_name (column_name column_type[, …])

定義表名和表結構。

表名和列名的命名規則,請參見命名約束

ENGINE='MYSQL'

外表的儲存引擎。讀寫MongoDB資料時,取值為MONGODB。

TABLE_PROPERTIES

外表屬性。

mapped_name

MongoDB集合的名稱。

location

MongoDB的專用網路地址

username

MongoDB資料庫的帳號

說明

MongoDB需要在目標資料庫中校正資料庫的帳號和密碼,請使用MongoDB專用網路地址中指定資料庫的帳號,如遇問題,請聯絡支援人員。

password

MongoDB資料庫帳號的密碼。

樣本

CREATE EXTERNAL TABLE adb_external_demo.mongodbtest (
  id int,
  name string,
  age int
) ENGINE = 'MONGODB' TABLE_PROPERTIES ='{
"mapped_name":"person",
"location":"mongodb://testuser:****@dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717,dds-bp113d414bca8****.mongodb.rds.aliyuncs.com:3717/test_mongodb",
"username":"testuser",
"password":"password",
}';

Tablestore外表

重要

如果Tablestore執行個體綁定了VPC,則綁定的VPC需要與AnalyticDB for MySQL叢集所在的VPC相同。

文法

CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OTS'
TABLE_PROPERTIES = '{
	"mapped_name":"table_name",
	"location":"tablestore_vpc_address"
}';

參數說明

參數

是否必填

說明

table_name (column_name column_type[, …])

定義表名和表結構。表名和列名的命名規則,請參見命名約束

ENGINE='OTS’

外表的儲存引擎。讀寫Tablestore資料時,取值為OTS。

mapped_name

Tablestore執行個體中的表名稱。您可以登入Table Store控制台,在執行個體管理頁面查看Tablestore執行個體的表名稱。

location

Tablestore執行個體的VPC訪問地址。您可以登入Table Store控制台,在執行個體管理頁面查看執行個體的VPC訪問地址。

樣本

CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.otstest (
	id int,
	name string,
	age int
) ENGINE = 'OTS' 
TABLE_PROPERTIES = '{
	"mapped_name":"person",
	"location":"https://w0****la.cn-hangzhou.vpc.tablestore.aliyuncs.com"
}';

MaxCompute外表

重要
  • MaxCompute專案需要AnalyticDB for MySQL叢集位於同一地區。

  • 如需大量建立MaxCompute外表,相關文法請參見IMPORT FOREIGN SCHEMA

文法

CREATE EXTERNAL TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='ODPS'
TABLE_PROPERTIES='{
	"endpoint":"endpoint",
	"accessid":"accesskey_id",
	"accesskey":"accesskey_secret",
	["partition_column":"partition_column"],
	"project_name":"project_name",
	"table_name":"table_name",
	["auto_refresh":"true|false"],
	["auto_refresh_mode":"add_only|full"]
}';

參數說明

參數

是否必填

說明

table_name (column_name column_type[, …])

定義表名和表結構。其中,表結構需包含分區列。

table_name、column_name:表名和列名。表名和列名的命名規則,請參見命名約束

column_type:支援MaxCompute基礎資料類型和複雜資料類型(ARRAY、MAP、STRUCT)。

重要

3.2.1.0及以上版本支援MaxCompute複雜資料類型。複雜資料類型詳情,請參見複雜資料類型

雲原生資料倉儲AnalyticDB MySQL控制台集群資訊頁面的配寘資訊地區,查看和升級核心版本

ENGINE='ODPS'

外表的儲存引擎。讀寫MaxCompute資料時,取值為ODPS。

endpoint

MaxCompute的EndPoint(網域名稱節點)。

說明

僅支援通過VPC網路Endpoint訪問MaxCompute。如何查看MaxCompute Endpoint,請參見Endpoint

accessid

阿里雲帳號或具備MaxCompute存取權限的RAM使用者的AccessKey ID。

如何擷取AccessKey ID和AccessKey Secret,請參見帳號與許可權

accesskey

阿里雲帳號或具備MaxCompute存取權限的RAM使用者的AccessKey Secret。

如何擷取AccessKey ID和AccessKey Secret,請參見帳號與許可權

partition_column

分區列。MaxCompute表為分區表時,需要配置該參數。

project_name

MaxCompute專案的名稱。

table_name

MaxCompute的表名稱。

auto_refresh

是否開啟當前MaxCompute外表的Schema自動重新整理。取值:

  • true:開啟。

  • false(預設值):不開啟。

重要
  • 僅3.2.7.0及以上核心版本支援。

  • 開啟前需先配置叢集級開關external_table_schema_refresh_enabled,詳情請參見下文叢集級配置

auto_refresh_mode

Schema自動重新整理模式。僅當auto_refresh=true時生效。取值:

  • add_only(預設值):僅自動同步MaxCompute源表的新增列。源表刪除列和列類型變化時僅記錄警示,不會自動修改外表中繼資料。

  • full:自動同步MaxCompute源表的新增列、刪除列和列類型變化,使外表Schema與源表保持一致。

重要

僅3.2.7.0及以上核心版本支援。

樣本

CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mctest (
	id int,
	name varchar(1023),
	age int,
	dt string
) ENGINE='ODPS'
TABLE_PROPERTIES='{
	"accessid":"LTAI****************",
	"endpoint":"http://service.cn-hangzhou.maxcompute.aliyun.com/api",
	"accesskey":"yourAccessKeySecret",
	"partition_column":"dt",
	"project_name":"test_adb",
	"table_name":"person"
}';

Schema 自動重新整理(auto refresh)

MaxCompute外表支援Schema自動重新整理:開啟後,會按重新整理周期自動將MaxCompute源表的表結構變化同步到外表,無需重建外表或手動重新整理。是否開啟及重新整理範圍由建表時的auto_refreshauto_refresh_mode參數控制,參見上文參數說明

叢集級配置

在使用表級auto_refresh=true開啟Schema自動重新整理前,需先執行以下命令開啟叢集級自動重新整理開關。

-- 開啟Schema自動重新整理功能。
SET ADB_CONFIG external_table_schema_refresh_enabled=true;

-- Schema自動重新整理的輪詢間隔,單位為毫秒,預設值為300000(即5分鐘)。該配置需重啟叢集後生效。
SET ADB_CONFIG external_table_schema_refresh_poll_interval_ms=300000;

樣本

以下樣本建立一張開啟Schema自動重新整理、重新整理模式為add_only的MaxCompute外表:

CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mctest_add_only (
	id BIGINT,
	name VARCHAR(1024),
	amount DOUBLE
) ENGINE='ODPS'
TABLE_PROPERTIES='{
	"accessid":"LTAI****************",
	"accesskey":"yourAccessKeySecret",
	"endpoint":"https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api",
	"project_name":"test_adb",
	"table_name":"person",
	"auto_refresh":"true",
	"auto_refresh_mode":"add_only"
}';

MaxCompute源表新增列後,外表會在下一輪重新整理後自動新增對應列;源表刪除列或列類型變化不會自動應用。

以下樣本建立一張開啟Schema自動重新整理、重新整理模式為full的MaxCompute外表:

CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mctest_full (
	id BIGINT,
	name VARCHAR(1024),
	amount DOUBLE
) ENGINE='ODPS'
TABLE_PROPERTIES='{
	"accessid":"LTAI****************",
	"accesskey":"yourAccessKeySecret",
	"endpoint":"https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api",
	"project_name":"test_adb",
	"table_name":"person",
	"auto_refresh":"true",
	"auto_refresh_mode":"full"
}';

MaxCompute源表新增列、刪除列或列類型變化後,外表會在下一輪重新整理後同步更新中繼資料。

注意事項

  • Schema自動重新整理能力僅適用於ENGINE='ODPS'的MaxCompute外表。

  • add_only為預設模式,適用於生產環境中僅允許新增列的情境。

  • full模式會自動同步源表的刪除列和列類型變化,可能影響依賴舊列的SQL、應用程式、報表或視圖,請謹慎使用。

  • 如果基於 MaxCompute 外表建立了視圖且使用了*(例如CREATE VIEW view_name AS SELECT * FROM external_table),視圖在建立時會將其展開並儲存為固定的列列表。當 full 模式同步源表的刪除列或列名變化、且涉及視圖已儲存的列時,查詢該視圖會報錯並提示視圖失效、需重新建立,這屬於預期行為。建議避免在視圖中使用*。更多資訊,請參見注意事項

相關文檔