表格存储(Tablestore)入门指南
内容简介
表格存储(Tablestore)是阿里云自研的 NoSQL 多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务。表格存储的分布式存储和强大的索引引擎能够提供 PB 级存储、千万 TPS 以及毫秒级延迟的服务能力。
本文将以一个简单的学生成绩查询demo为例,向大家演示如何使用Tablestore提供的Java SDK实现一个表格数据的导入、查询(主键索引、二级索引和多元索引)和导出。
demo中表格(table)的存储信息格式如下:
ID(主键)
班级(主键)
姓名(主键)
语文
数学
英语
0
初三1班
云知
99
99
99
主要实现的功能如下:
创建学生成绩的数据表格;
添加学生成绩信息;
查询学生成绩信息;
更新学生成绩信息;
删除学生成绩信息;
查询特定班级的学生成绩信息(二级索引);
查询多科目特定分段的学生成绩信息(多元索引);
导出新增学生成绩信息(通道服务)。
一、配置开发环境
Tablestore的Java SDK开发环境非常简单,主要包括:
* 了解并开通阿里云表格存储服务
* 创建AccessKey
* 配置Java环境(建议:JDK 6及以上版本)
* 使用Maven项目加入依赖项
com.aliyun.openservices
tablestore
4.12.1
二、表格的一般操作
1、获取实例的控制权限
首先创建实例,实例是表格存储资源管理的基础单元,表格存储对应用程序的访问控制和资源计量都在实例级别完成。
实例创建成功后,可以通过“SyncClient client”获取实例控制权柄,然后通过client实现对实例的各种控制。
/**
* 以下信息可由阿里云控制台获取,依次为:
* endPoint(实例访问地址)
* accessId(AccessKey ID)
* accessKey(Access Key Secret)
* instanceName(实例名称,用户创建实例时指定)
*/
private static final String endPoint = "https://xxxx.cn-hangzhou.ots.aliyuncs.com";
private static final String accessId = "LTAIxxxebxxxKIxx";
private static final String accessKey = "5P7xxxMm1xxxhHPxxxXnNxxxXscxxx";
private static final String instanceName = "instance-1";
SyncClient client = new SyncClient(endPoint, accessId, accessKey, instanceName);
2、创建学生成绩的数据表格
在创建学生成绩的数据表格时需要描述表的结构信息(TableMeta)和配置信息(TableOptions)。
public static void creatTable(){
System.out.println("开始创建表格。");
//描述表的结构信息
TableMeta tableMeta = new TableMeta(tableName);
//添加主键列
tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("ID", PrimaryKeyType.INTEGER));
tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("班级", PrimaryKeyType.INTEGER));
tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("姓名", PrimaryKeyType.STRING));
//添加属性列
tableMeta.addDefinedColumn(new DefinedColumnSchema("语文", DefinedColumnType.INTEGER));
tableMeta.addDefinedColumn(new DefinedColumnSchema("数学", DefinedColumnType.INTEGER));
tableMeta.addDefinedColumn(new DefinedColumnSchema("英语", DefinedColumnType.INTEGER));
int timeToLive = -1; // 数据的过期时间, 单位秒, -1代表永不过期. 假如设置过期时间为一年, 即为 365 * 24 * 3600.
int maxVersions = 1; // 最大保存版本数, maxVersions大于1时, 无法使用二级索引和多元索引功能.
//描述表的配置信息
TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
//将表的结构信息和配置信息封装到一个request里
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
//创建表格
try {
client.createTable(request);
System.out.println("创建表格成功。");
} catch (TableStoreException e) {
System.err.println("操作失败,详情:" + e.getMessage());
System.err.println("Request ID:" + e.getRequestId());
} catch (ClientException e) {
System.err.println("请求失败,详情:" + e.getMessage());
}
}
3、添加学生成绩信息
PutRow 接口用于插入一行数据,如果原来该行已经存在,会覆盖原来的一行。
明确主键信息和属性信息,我们便可以使用PutRow接口将该信息添加入表中。
public static void creatRow(){
//描述主键信息
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("ID", PrimaryKeyValue.fromLong(3));
primaryKeyBuilder.addPrimaryKeyColumn("班级", PrimaryKeyValue.fromLong("初三2班"));
primaryKeyBuilder.addPrimaryKeyColumn("姓名", PrimaryKeyValue.fromLong("云知"));
PrimaryKey primaryKey = primaryKeyBuilder.bui