通過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());
}
}
}
}
步驟三:讀取時序資料
以下樣本用於讀取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網址。