CREATE EXTERNAL TABLE

云原生数据仓库 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')]

参数说明

参数

是否必填

说明

table_name (column_name column_type[, …])

定义表名和表结构。

表名和列名的命名规则,请参见命名约束

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}

指定文件格式。

如果文件是.txt或.csv格式,请配置为STORED AS TEXTFILEPARQUET格式的文件支持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(默认值):否。

重要

该参数仅在创建分区外表时生效。

示例

示例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_name5个固定列。

  • 指定文件存储格式为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}"]
  }';

参数说明

参数

是否必填

说明

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-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",
}';

参数说明

参数

是否必填

说明

table_name (column_name column_type[, …])

定义表名和表结构。

表名和列名的命名规则,请参见命名约束

ENGINE='MYSQL'

外表的存储引擎。读写MongoDB数据时,取值为MONGODB。

TABLE_PROPERTIES

外表属性。

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"
}';

参数说明

参数

是否必填

说明

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"
}'; 

参数说明

参数

是否必填

说明

table_name (column_name column_type[, …])

定义表名和表结构。其中,表结构需包含分区列。

table_name、column_name:表名和列名。表名和列名的命名规则,请参见命名约束

column_type:支持MaxCompute基础数据类型和复杂数据类型(ARRAY、MAP、STRUCT)。

说明

3.2.1.0及以上版本支持MaxCompute复杂数据类型。复杂数据类型详情,请参见复杂数据类型

查看企业版基础版湖仓版集群的内核版本,请执行SELECT adb_version();。如需升级内核版本,请联系技术支持。

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的表名称。

示例

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"
}';

相关文档