云原生数据仓库 AnalyticDB MySQL 版支持创建多种外表,包括:OSS外表、RDS MySQL外表、MongoDB外表、Tablestore外表、MaxCompute外表。
前提条件
集群的产品系列为湖仓版。
集群的内核版本为3.1.8.0及以上版本。
说明查看湖仓版集群的内核版本,请执行
SELECT adb_version();
。如需升级内核版本,请联系技术支持。已创建外部数据库。创建外部数据库的方法,请参见CREATE EXTERNAL DATABASE。
注意事项
不支持跨账号创建外表。
OSS外表
OSS Bucket需要与AnalyticDB for MySQL集群位于同一地域。
仅3.1.9.2及以上内核版本的集群支持创建Hudi外表。
查看湖仓版集群的内核版本,请执行
SELECT adb_version();
。如需升级内核版本,请联系技术支持。创建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|RCFIL|HUDI}
LOCATION 'OSS_LOCATION';
[TBLPROPERTIES (
'type' = 'cow|mor'
'auto.create.location' = 'true|false')]
参数说明
参数 | 是否必填 | 说明 |
| 是 | 定义表名和表结构。 表名和列名的命名规则,请参见命名约束。 |
| 否 | 创建分区外表时,需要配置该参数指定分区列。指定多个分区列,表示创建多级分区表。 |
| 是 | 指定列分隔符。您可以指定任意符号,但需和文件中的分隔符一致。本文以英文逗号(,)为例。 重要 仅 |
| 是 | 指定文件格式。 如果文件是.txt或.csv格式,请配置为 重要 仅3.1.8.0及以上内核版本的集群支持STRUCT数据类型的 |
| 是 | 指定OSS文件或目录所在的路径。 指定OSS目录的路径时,请遵循以下规则,否则可能导致查询失败或结果异常。
创建分区外表时,请指定LOCATION为分区的上一级目录。例如,OSS文件的路径为 重要
|
| 否 | Hudi外表的类型,取值:
重要 仅当 |
| 否 | 是否自动创建OSS文件或目录所在的路径。取值:
重要 该参数仅在创建分区外表时生效。 |
示例
示例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');
重要创建Hudi外表时,会自动创建
_hoodie_commit_time
、_hoodie_commit_seqno
、_hoodie_record_key
、_hoodie_partition_path
和_hoodie_file_name
5个固定列。指定文件存储格式为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';
示例2:创建分区外表
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.osstest4
(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.osstest5
(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开关。
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}"]
}';
参数说明
参数 | 是否必填 | 说明 |
| 是 | 定义表名和表结构。 表名和列名的命名规则,请参见命名约束。 |
| 是 | 外表的存储引擎。读写RDS MySQL数据时,取值为MYSQL。 |
| 是 | 外表属性。 |
| 是 | RDS MySQL实例的内网地址、端口号和数据库名。如何获取RDS的内网地址,请参见查看或修改内外网地址和端口。 |
| 是 | RDS MySQL的表名称。 |
| 是 | RDS MySQL数据库的账号。 |
| 是 | RDS MySQL数据库账号的密码。 |
| 否 | MySQL外表字符集,取值说明:
|
示例
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-bp1gx6h1tyd04****.mysql.rds.aliyuncs.com:3306/test_adb",
"tablename":"person",
"username":"testUserName",
"password":"testUserPassword",
"charset":"utf8"
}';
MongoDB外表
创建MongoDB外表,请提前在AnalyticDB MySQL控制台的集群信息页面打开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",
}';
参数说明
参数 | 是否必填 | 说明 |
| 是 | 定义表名和表结构。 表名和列名的命名规则,请参见命名约束。 |
| 是 | 外表的存储引擎。读写MongoDB数据时,取值为MONGODB。 |
| 是 | 外表属性。 |
mapped_name | 是 | MongoDB集合的名称。 |
location | 是 | MongoDB的专有网络地址。如何获取专有网络的连接地址,请参见实例连接地址说明。 |
username | 是 | MongoDB数据库的账号。如何创建数据库账号,请参见MongoDB数据库账号权限管理。 说明 MongoDB需要在目标数据库中校验数据库的账号和密码,请使用MongoDB专有网络地址中指定数据库的账号,如遇问题,请联系技术支持。 |
password | 是 | MongoDB数据库账号的密码。 |
示例
CREATE EXTERNAL TABLE adb_external_demo.person (
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"
}';
参数说明
参数 | 是否必填 | 说明 |
| 是 | 定义表名和表结构。表名和列名的命名规则,请参见命名约束。 |
| 是 | 外表的存储引擎。读写Tablestore数据时,取值为OTS。 |
| 是 | Tablestore实例中的表名称。您可以登录表格存储控制台,在实例管理页面查看Tablestore实例的表名称。 |
| 是 | 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"
}';
参数说明
参数 | 是否必填 | 说明 |
| 是 | 定义表名和表结构。其中,表结构需包含分区列。 table_name、column_name:表名和列名。表名和列名的命名规则,请参见命名约束。 column_type:支持MaxCompute基础数据类型和复杂数据类型(ARRAY、MAP、STRUCT)。 说明 3.2.1.0及以上版本支持MaxCompute复杂数据类型。复杂数据类型详情,请参见复杂数据类型。 查看湖仓版集群的内核版本,请执行 |
| 是 | 外表的存储引擎。读写MaxCompute数据时,取值为ODPS。 |
| 是 | MaxCompute的EndPoint(域名节点)。 说明 仅支持通过VPC网络Endpoint访问MaxCompute。如何查看MaxCompute Endpoint,请参见Endpoint。 |
| 是 | 阿里云账号或具备MaxCompute访问权限的RAM用户的AccessKey ID。 如何获取AccessKey ID和AccessKey Secret,请参见账号与权限。 |
| 是 | 阿里云账号或具备MaxCompute访问权限的RAM用户的AccessKey Secret。 如何获取AccessKey ID和AccessKey Secret,请参见账号与权限。 |
| 否 | 分区列。MaxCompute表为分区表时,需要配置该参数。 |
| 是 | MaxCompute项目的名称。 |
| 是 | MaxCompute的表名称。 |
示例
CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_demo.mctest (
id int,
name varchar(1023),
age int,
dt string
) ENGINE='ODPS'
TABLE_PROPERTIES='{
"accessid":"LTAILd4****",
"endpoint":"http://service.cn-hangzhou.maxcompute.aliyun.com/api",
"accesskey":"4A5Q7ZVzcYnWMQPysX****",
"partition_column":"dt",
"project_name":"test_adb",
"table_name":"person"
}';
相关文档
OSS外表:通过外表导入OSS数据至湖仓版。
RDS MySQL外表:通过外表导入至湖仓版。
MongoDB外表:MongoDB数据导入。
Tablestore外表:查询并导入Tablestore数据。
MaxCompute外表:通过外表导入至湖仓版。