全部產品
Search
文件中心

Tablestore:Java SDK快速入門

更新時間:Jun 30, 2024

通過TablestoreJava SDK使用Tablestore寬表模型或者時序模型時,您需要先建立表,然後寫入資料到表中以及讀取表中資料。本文介紹如何快速使用寬表模型和時序模型。

背景資訊

Tablestore提供了寬表模型、時序模型、訊息模型等多種資料模型,SDK參考文檔中主要介紹使用寬表模型和時序模型時的功能操作。

  • 使用寬表模型時,您需要先建立資料表,然後寫入資料到資料表以及讀取資料表中的資料。具體程式碼範例請參見寬表模型樣本

  • 使用時序模型時,您需要先建立時序表,然後寫入資料到時序表以及讀取時序表中的資料。具體程式碼範例請參見時序模型樣本

前提條件

  • 已初始化用戶端。具體操作,請參見初始化OTSClient

  • 4.0.0以上版本SDK支援資料多版本和生命週期。建立資料表前請確認已瞭解資料多版本和生命週期,更多資訊,請參見資料版本和生命週期

寬表模型樣本

使用已初始化的Client調用Tablestore寬表模型的功能。以下介紹寬表模型的建立表、寫入資料和讀取資料的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調用Tablestore時序模型的功能。此處以時序模型的建立表、寫入資料和讀取資料為例介紹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());
        }
    }
}

參考文檔