查询并导入Tablestore数据

本文介绍如何在云原生数据仓库 AnalyticDB MySQL 版企业版、基础版及湖仓版中查询并导入Tablestore数据。

前提条件

  • 已创建Tablestore实例。具体操作,请参见使用流程

  • 已创建AnalyticDB for MySQL企业版、基础版及湖仓版集群。具体操作,请参见创建集群

    说明

    如果在创建Tablestore实例时绑定了VPC,请确保AnalyticDB for MySQL与Tablestore有相同的VPC。

背景信息

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

操作步骤

  1. 进入SQL开发编辑器。

    1. 登录云原生数据仓库AnalyticDB MySQL控制台,在左上角选择集群所在地域。在左侧导航栏,单击集群列表,在企业版、基础版或湖仓版页签下,单击目标集群ID。

    2. 在左侧导航栏,单击作业开发 > SQL开发

  2. 创建外部数据库。

    以创建adb_external_db数据库为例,建库示例语句如下:

    CREATE EXTERNAL database adb_external_db;
  3. 创建外表。

    说明

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

  4. 外表创建成功后,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)
  5. 如果需要导入Tablestore数据到AnalyticDB for MySQL,可查看接下来的步骤。

    1. AnalyticDB for MySQL中创建数据库,示例如下:

      CREATE DATABASE adb_demo; 
    2. 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);                   
    3. 向表中写入数据,示例如下:

      • 方式一:执行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