通过表格存储Java SDK使用表格存储宽表模型或者时序模型时,您需要先创建表,然后写入数据到表中以及读取表中数据。本文介绍如何快速使用宽表模型和时序模型。
背景信息
表格存储提供了宽表模型、时序模型、消息模型等多种数据模型,SDK参考文档中主要介绍使用宽表模型和时序模型时的功能操作。
前提条件
宽表模型示例
使用已初始化的Client调用表格存储宽表模型的功能。以下介绍宽表模型的创建表、写入数据和读取数据的Java SDK代码示例。
步骤一:创建数据表
以下示例用于在myinstance实例下创建一个数据表。该表中属性列最多保存3个版本的数据,且数据永不过期。
不同地域下实例的Endpoint取值不同,请以实际为准。关于如何获取Endpoint的具体操作,请参见获取实例Endpoint。
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.model.*;
public class CreateTable {
public static void main(String[] args) {
//创建并初始化客户端。
final String endPoint = "https://myinstance.cn-hangzhou.ots.aliyuncs.com";
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "myinstance";
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName);
//创建API请求并设置参数。
//设置数据表名称。
TableMeta tableMeta = new TableMeta("<TABLE_NAME>");
//为数据表添加主键列。
tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema("pk", PrimaryKeyType.STRING));
//数据的过期时间,单位为秒,-1表示永不过期。带索引表的数据表数据生命周期必须设置为-1。
int timeToLive = -1;
//保存的最大版本数,1表示每列上最多保存一个版本即保存最新的版本。带索引表的数据表最大版本数必须设置为1。
int maxVersions = 3;
TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
//设置预留读写吞吐量,容量型实例中的数据表只能设置为0,高性能实例中的数据表可以设置为非零值。
request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0)));
//发起请求。
client.createTable(request);
}
}
步骤二:写入数据
以下示例用于在数据表中写入一行数据。该行数据包含10个属性列,每个属性列写入3个版本数据。
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.model.*;
public class PutRow {
public static void main(String[] args) {
//创建并初始化客户端。
final String endPoint = "https://myinstance.cn-hangzhou.ots.aliyuncs.com";
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "myinstance";
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName);
//创建API请求并设置参数。
//构造主键。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//设置数据表名称。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
//加入一些属性列。
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
PutRowRequest request = new PutRowRequest(rowPutChange);
//发起请求。
client.putRow(request);
}
}
步骤三:读取数据
以下示例用于读取表中的一行数据,只读取最新版本数据且只返回Col0列值。
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.model.*;
public class GetRow {
public static void main(String[] args) {
//创建并初始化客户端。
final String endPoint = "https://myinstance.cn-hangzhou.ots.aliyuncs.com";
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "myinstance";
SyncClient client = new SyncClient(endPoint, accessKeyId, accessKeySecret, instanceName);
//创建API请求并设置参数。
//构造主键。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
//读取一行数据,设置数据表名称。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
//设置读取最新版本。
criteria.setMaxVersions(1);
//设置读取某些列。
criteria.addColumnsToGet("Col0");
GetRowRequest getRowRequest = new GetRowRequest(criteria);
//发起请求并打印返回结果。
GetRowResponse getRowResponse = client.getRow(getRowRequest);
Row row = getRowResponse.getRow();
System.out.println("读取完毕,结果为: ");
System.out.println(row);
}
}
时序模型示例
使用已初始化的Client调用表格存储时序模型的功能。此处以时序模型的创建表、写入数据和读取数据为例介绍Java SDK的代码示例。
步骤一:创建时序表
以下示例用于在myinstance实例下创建一个时序表。该时序表的数据永不过期。
import com.alicloud.openservices.tablestore.TimeseriesClient;
import com.alicloud.openservices.tablestore.model.TimeseriesTableMeta;
import com.alicloud.openservices.tablestore.model.TimeseriesTableOptions;
import com.alicloud.openservices.tablestore.model.timeseries.CreateTimeseriesTableRequest;
public class CreateTimeseriesTable {
public static void main(String[] args) {
//创建并初始化客户端。
final String endPoint = "https://myinstance.cn-hangzhou.ots.aliyuncs.com";
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "myinstance";
TimeseriesClient client = new TimeseriesClient(endPoint, accessKeyId, accessKeySecret, instanceName);
//创建API请求并设置参数。
String tableName = "<TABLE_NAME>";
TimeseriesTableMeta timeseriesTableMeta = new TimeseriesTableMeta(tableName);
int timeToLive = -1;
timeseriesTableMeta.setTimeseriesTableOptions(new TimeseriesTableOptions(timeToLive));
CreateTimeseriesTableRequest request = new CreateTimeseriesTableRequest(timeseriesTableMeta);
//发起请求。
client.createTimeseriesTable(request);
}
}
步骤二:写入时序数据
以下示例用于在时序表中写入10条时间线数据。
import com.alicloud.openservices.tablestore.TimeseriesClient;
import com.alicloud.openservices.tablestore.model.ColumnValue;
import com.alicloud.openservices.tablestore.model.timeseries.PutTimeseriesDataRequest;
import com.alicloud.openservices.tablestore.model.timeseries.PutTimeseriesDataResponse;
import com.alicloud.openservices.tablestore.model.timeseries.TimeseriesKey;
import com.alicloud.openservices.tablestore.model.timeseries.TimeseriesRow;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PutTimeseriesData {
public static void main(String[] args) {
//创建并初始化客户端。
final String endPoint = "https://myinstance.cn-hangzhou.ots.aliyuncs.com";
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "myinstance";
TimeseriesClient client = new TimeseriesClient(endPoint, accessKeyId, accessKeySecret, instanceName);
//创建API请求并设置参数。
List<TimeseriesRow> rows = new ArrayList<TimeseriesRow>();
for (int i = 0; i < 10; i++) {
Map<String, String> tags = new HashMap<String, String>();
tags.put("region", "hangzhou");
tags.put("os", "Ubuntu16.04");
// 通过measurementName、dataSource和tags构建TimeseriesKey。
TimeseriesKey timeseriesKey = new TimeseriesKey("cpu", "host_" + i, tags);
// 指定timeseriesKey和timeInUs创建timeseriesRow。
TimeseriesRow row = new TimeseriesRow(timeseriesKey, System.currentTimeMillis() * 1000 + i);
// 增加数据值(field)。
row.addField("cpu_usage", ColumnValue.fromDouble(10.0));
row.addField("cpu_sys", ColumnValue.fromDouble(5.0));
rows.add(row);
}
String tableName = "<TABLE_NAME>";
PutTimeseriesDataRequest putTimeseriesDataRequest = new PutTimeseriesDataRequest(tableName);
putTimeseriesDataRequest.setRows(rows);
//发起请求并检查是否写入成功。
// 一次写入多行时序数据。
PutTimeseriesDataResponse putTimeseriesDataResponse = client.putTimeseriesData(putTimeseriesDataRequest);
// 检查是否全部成功。
if (!putTimeseriesDataResponse.isAllSuccess()) {
for (PutTimeseriesDataResponse.FailedRowResult failedRowResult : putTimeseriesDataResponse.getFailedRows()) {
System.out.println(failedRowResult.getIndex());
System.out.println(failedRowResult.getError());
}
}
}
}
步骤三:读取时序数据
以下示例用于读取cpu
为host_0
的时间线中满足指定条件的数据并计算满足条件数据的个数。
import com.alicloud.openservices.tablestore.TimeseriesClient;
import com.alicloud.openservices.tablestore.model.ColumnType;
import com.alicloud.openservices.tablestore.model.timeseries.GetTimeseriesDataRequest;
import com.alicloud.openservices.tablestore.model.timeseries.GetTimeseriesDataResponse;
import com.alicloud.openservices.tablestore.model.timeseries.TimeseriesKey;
import java.util.HashMap;
import java.util.Map;
public class GetTimeseriesData {
public static void main(String[] args) {
//创建并初始化客户端。
final String endPoint = "https://myinstance.cn-hangzhou.ots.aliyuncs.com";
String accessKeyId = System.getenv("OTS_AK_ENV");
String accessKeySecret = System.getenv("OTS_SK_ENV");
final String instanceName = "myinstance";
TimeseriesClient client = new TimeseriesClient(endPoint, accessKeyId, accessKeySecret, instanceName);
//创建API请求并设置参数。
String tableName = "<TABLE_NAME>";
GetTimeseriesDataRequest getTimeseriesDataRequest = new GetTimeseriesDataRequest(tableName);
Map<String, String> tags = new HashMap<String, String>();
tags.put("region", "hangzhou");
tags.put("os", "Ubuntu16.04");
// 通过measurementName、dataSource和tags构建TimeseriesKey。
TimeseriesKey timeseriesKey = new TimeseriesKey("cpu", "host_0", tags);
getTimeseriesDataRequest.setTimeseriesKey(timeseriesKey);
// 指定时间范围。
getTimeseriesDataRequest.setTimeRange(0, (System.currentTimeMillis() + 60 * 1000) * 1000);
// 限制返回行数。
getTimeseriesDataRequest.setLimit(10);
// 设置是否倒序读取数据,可不设置,默认值为false。如果设置为true,则倒序读取数据。
getTimeseriesDataRequest.setBackward(false);
// 设置获取部分数据列,可不设置,默认获取全部数据列。
getTimeseriesDataRequest.addFieldToGet("cpu_sys", ColumnType.DOUBLE);
getTimeseriesDataRequest.addFieldToGet("cpu_usage", ColumnType.DOUBLE);
//发起请求并打印返回结果。
GetTimeseriesDataResponse getTimeseriesDataResponse = client.getTimeseriesData(getTimeseriesDataRequest);
System.out.println(getTimeseriesDataResponse.getRows().size());
if (getTimeseriesDataResponse.getNextToken() != null) {
// 如果nextToken不为空,可以发起下一次请求。
getTimeseriesDataRequest.setNextToken(getTimeseriesDataResponse.getNextToken());
getTimeseriesDataResponse = client.getTimeseriesData(getTimeseriesDataRequest);
System.out.println(getTimeseriesDataResponse.getRows().size());
}
}
}
参考文档
如果使用过程中出现错误,请参见错误码说明进行处理。更多信息,请参见错误码参考。
使用宽表模型时,关于创建表、写入数据和读取数据的更多信息,请参见创建数据表、创建加密表、写入数据、读取数据。相关API信息,请参见CreateTable、PutRow和GetRow。
使用时序模型时,关于创建表、写入数据和读取数据的更多信息,请参见创建时序表、写入时序数据、查询时序数据。相关API信息,请参见CreateTimeseriesTable、PutTimeseriesData和GetTimeseriesData。
如果要查看Java SDK源码,请访问Tablestore Java SDK GitHub网址。