本文介绍如何在云原生数据仓库 AnalyticDB MySQL 版湖仓版中查询并导入Tablestore数据。
前提条件
背景信息
Tablestore是阿里云自研的NoSQL多模型数据库,支持多元索引查询。您可以在AnalyticDB for MySQL中调用TableStore API进行数据查询,例如点查询、范围查询等。同时,支持智能选择主表、二级索引表和多元索引表,大大提升查询性能,降低用户成本。
TableStore实例是您使用和管理表格存储服务的实体,每个实例相当于一个数据库。Tablestore的实例对应AnalyticDB for MySQL的Schema或Database。Tablestore实例如果没有绑定VPC网络,那么AnalyticDB for MySQL可以直接访问。如果Tablestore实例绑定了VPC网络,那么请确保AnalyticDB for MySQL和Tablestore实例配置的VPC相同。
示例数据说明
本文示例中,在Tablestore中创建person
表,并向表中插入4条记录。如果您已经有数据源,请跳过该步骤。
id(主键) | name | age |
1 | james | 10 |
2 | bond | 20 |
3 | jack | 30 |
4 | lucy | 40 |
操作步骤
进入SQL开发编辑器。
登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在湖仓版页签下,单击目标集群ID。
在左侧导航栏,单击 。
创建外部数据库。
以创建
adb_external_db
数据库为例,建库示例语句如下:CREATE EXTERNAL database adb_external_db;
创建外表。
说明AnalyticDB for MySQL外表和TableStore中表的字段名称、字段数量、字段顺序一致,字段类型兼容。数据类型映射关系,请参见数据类型映射关系。
在
adb_external_db
数据库中,创建person
表,建表示例语句如下:CREATE EXTERNAL TABLE IF NOT EXISTS adb_external_db.person ( id int, name string, age int ) ENGINE = 'OTS' TABLE_PROPERTIES = '{ "mapped_name":"person", "location":"https://w0****la.cn-hangzhou.vpc.tablestore.aliyuncs.com" }'
参数
说明
ENGINE='OTS’
外表的存储引擎。读写Tablestore数据时,取值为OTS。
mapped_name
Tablestore实例中的表名称。查看Tablestore实例的表名称,登录表格存储控制台,在实例管理页面查看。
location
Tablestore实例的VPC访问地址。查看Tablestore实例的VPC访问地址,登录表格存储控制台,在实例管理页面查看。
外表创建成功后,AnalyticDB for MySQL自动将Tablestore的表数据映射到AnalyticDB for MySQL表。您可以在AnalyticDB for MySQL中通过SELECT查询Tablestore中
person
表的数据。SELECT * FROM adb_external_db.person;
返回结果如下:
+------+-------+------+ | id | name | age | +------+-------+------+ | 1 | james | 10 | | 2 | bond | 20 | | 3 | jack | 30 | | 4 | lucy | 40 | +------+-------+------+ 4 rows in set (0.35 sec)
如果需要导入Tablestore数据到AnalyticDB for MySQL,可查看接下来的步骤。
在AnalyticDB for MySQL中创建数据库,示例如下:
CREATE DATABASE adb_demo;
在AnalyticDB for MySQL中创建表用于存储从Tablestore中导入的数据,示例如下:
说明新表和步骤3中创建的外表的字段顺序和字段数量需要一致,字段类型兼容。
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test( id int, name string, age int ) DISTRIBUTED BY HASH(id);
向表中写入数据,示例如下:
方式一:执行INSERT INTO导入数据,当主键重复时会自动忽略当前写入数据,不做更新,作用等同于
INSERT IGNORE INTO
,详情请参见INSERT INTO。示例如下:INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
通过SELECT查询写入表中的数据,示例如下:
SELECT * FROM adb_demo.adb_import_test;
返回结果如下:
+------+-------+------+ | id | name | age | +------+-------+------+ | 1 | james | 10 | | 2 | bond | 20 | | 3 | jack | 30 | | 4 | lucy | 40 | +------+-------+------+
方式二:执行INSERT OVERWRITE导入数据,会覆盖表中原有的数据。示例如下:
INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
方式三:异步执行INSERT OVERWRITE导入数据。通常使用
SUBMIT JOB
提交异步任务,由后台调度,可以在写入任务前增加Hint(/*+ direct_batch_load=true*/
)加速写入任务。详情请参见异步写入。示例如下:SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
返回结果如下:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |
关于异步提交任务详情,请参见异步提交导入任务。
数据类型映射关系
Tablestore支持的数据类型与AnalyticDB for MySQL数据类型的映射关系如下:
Tablestore支持的数据类型 | 映射到AnalyticDB for MySQL的数据类型 |
INTEGER(8字节) | BIGINT(8字节) |
STRING | VARCHAR |
BINARY | BINARY |
DOUBLE | DOUBLE |
BOOLEAN | BOOLEAN |