CREATE EXTERNAL TABLE

更新时间:
复制 MD 格式

云原生数据仓库 AnalyticDB 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元数据文件,即.hoodies文件。

  • 如果您已配置了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实例中的表名称。您可以登录表格存储控制台,在实例管理页面查看Tablestore实例的表名称。

location

Tablestore实例的VPC访问地址。您可以登录表格存储控制台,在实例管理页面查看实例的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

MaxComputeEndPoint(域名节点)。

说明

仅支持通过VPC网络Endpoint访问MaxCompute。如何查看MaxCompute Endpoint,请参见Endpoint

accessid

阿里云账号或具备MaxCompute访问权限的RAM用户的AccessKey ID。

如何获取AccessKey IDAccessKey Secret,请参见账号与权限

accesskey

阿里云账号或具备MaxCompute访问权限的RAM用户的AccessKey Secret。

如何获取AccessKey IDAccessKey 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_onlyMaxCompute外表:

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自动刷新、刷新模式为fullMaxCompute外表:

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 模式同步源表的删除列或列名变化、且涉及视图已保存的列时,查询该视图会报错并提示视图失效、需重新创建,这属于预期行为。建议避免在视图中使用*。更多信息,请参见注意事项

相关文档