通過表格存儲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網址。