Java SDK快速入门

通过表格存储Java SDK使用表格存储宽表模型或者时序模型时,您需要先创建表,然后写入数据到表中以及读取表中数据。本文介绍如何快速使用宽表模型和时序模型。

背景信息

表格存储提供了宽表模型、时序模型、消息模型等多种数据模型,SDK参考文档中主要介绍使用宽表模型和时序模型时的功能操作。

  • 使用宽表模型时,您需要先创建数据表,然后写入数据到数据表以及读取数据表中的数据。具体代码示例请参见宽表模型示例

  • 使用时序模型时,您需要先创建时序表,然后写入数据到时序表以及读取时序表中的数据。具体代码示例请参见时序模型示例

前提条件

  • 已初始化客户端。具体操作,请参见初始化客户端

  • 4.0.0以上版本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());
            }
        }
    }
}

步骤三:读取时序数据

以下示例用于读取cpuhost_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());
        }
    }
}

参考文档