Tablestore提供了PutRow和UpdateRow介面用於寫入單行資料以及BatchWriteRow介面用於批量寫入資料。
前提條件
- 已初始化OTSClient。具體操作,請參見初始化。
- 已建立資料表並寫入資料。
插入單行資料
調用PutRow介面新寫入一行資料。如果該行已存在,則先刪除原行資料(原行的所有列以及所有版本的資料),再寫入新行資料。
參數
參數 | 說明 |
---|---|
tableName | 資料表名稱。 |
primaryKey | 行的主鍵。
说明
|
condition | 使用條件更新,可以設定原行的存在性條件或者原行中某列的列值條件。更多資訊,請參見條件更新。
说明
|
column | 行的屬性列。
|
樣本
- 樣本1
寫入10列屬性列,每列寫入1個版本,由系統自動產生資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) { //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue)); PrimaryKey primaryKey = primaryKeyBuilder.build(); //設定資料表名稱。 RowPutChange rowPutChange = new RowPutChange(TABLE_NAME, primaryKey); //加入一些屬性列。 for (int i = 0; i < 10; i++) { rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(i))); } client.putRow(new PutRowRequest(rowPutChange)); }
- 樣本2
寫入10列屬性列,每列寫入3個版本,自訂資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) { //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, 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)); } } client.putRow(new PutRowRequest(rowPutChange)); }
- 樣本3
期望原行不存在時,寫入10列屬性列,每列寫入3個版本,自訂資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) { //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue)); PrimaryKey primaryKey = primaryKeyBuilder.build(); //設定資料表名稱。 RowPutChange rowPutChange = new RowPutChange(TABLE_NAME, primaryKey); //設定條件更新,行條件檢查為期望原行不存在。 rowPutChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST)); //加入一些屬性列。 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)); } } client.putRow(new PutRowRequest(rowPutChange)); }
- 樣本4
期望原行存在且Col0列的值大於100時,寫入10列屬性列,每列寫入3個版本,自訂資料的版本號碼(時間戳記)。
private static void putRow(SyncClient client, String pkValue) { //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue)); PrimaryKey primaryKey = primaryKeyBuilder.build(); //設定資料表名稱。 RowPutChange rowPutChange = new RowPutChange(TABLE_NAME, primaryKey); //設定條件更新,期望原行存在且Col0列的值大於100時寫入資料。 Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST); condition.setColumnCondition(new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100))); rowPutChange.setCondition(condition); //加入一些屬性列。 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)); } } client.putRow(new PutRowRequest(rowPutChange)); }
更新單行資料
參數
參數 | 說明 |
---|---|
tableName | 資料表名稱。 |
primaryKey | 行的主鍵。
说明 設定的主鍵個數和類型必須和資料表的主鍵個數和類型一致。
|
condition | 使用條件更新,可以設定原行的存在性條件或者原行中某列的列值條件。更多資訊,請參見條件更新。 |
column | 更新的屬性列。
|
樣本
- 樣本1
更新一些列,刪除某列的某一版本資料,刪除某列。
private static void updateRow(SyncClient client, String pkValue) { //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue)); PrimaryKey primaryKey = primaryKeyBuilder.build(); //設定資料表名稱。 RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey); //更新一些列。 for (int i = 0; i < 10; i++) { rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i))); } //刪除某列的某一版本。 rowUpdateChange.deleteColumn("Col10", 1465373223000L); //刪除某一列。 rowUpdateChange.deleteColumns("Col11"); client.updateRow(new UpdateRowRequest(rowUpdateChange)); }
- 樣本2
設定更新的條件。
private static void updateRow(SyncClient client, String pkValue) { //構造主鍵。 PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder(); primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue)); PrimaryKey primaryKey = primaryKeyBuilder.build(); //設定資料表名稱。 RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, primaryKey); //設定條件更新,期望原行存在且Col0列的值大於100時更新資料。 Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST); condition.setColumnCondition(new SingleColumnValueCondition("Col0", SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100))); rowUpdateChange.setCondition(condition); //更新一些列。 for (int i = 0; i < 10; i++) { rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i))); } //刪除某列的某一版本。 rowUpdateChange.deleteColumn("Col10", 1465373223000L); //刪除某一列。 rowUpdateChange.deleteColumns("Col11"); client.updateRow(new UpdateRowRequest(rowUpdateChange)); }
批量寫入資料
調用BatchWriteRow介面在一次請求中進行批量的寫入操作,也支援一次對多張表進行寫入。BatchWriteRow操作由多個PutRow、UpdateRow、DeleteRow子操作組成,構造子操作的過程與使用PutRow介面、UpdateRow介面和DeleteRow介面時相同,也支援使用條件更新。
BatchWriteRow的各個子操作獨立執行,Tablestore會分別返回各個子操作的執行結果。
注意事項
由於批量寫入可能存在部分行失敗的情況,失敗行的Index及錯誤資訊在返回的BatchWriteRowResponse中,但並不拋出異常。因此調用BatchWriteRow介面時,需要檢查傳回值,可通過BatchWriteRowResponse的isAllSucceed方法判斷是否全部成功;如果不檢查傳回值,則可能會忽略掉部分操作的失敗。
當服務端檢查到某些操作出現參數錯誤時,BatchWriteRow介面可能會拋出參數錯誤的異常,此時該請求中所有的操作都未執行。
樣本
一次BatchWriteRow請求包含2個PutRow操作、1個UpdateRow操作和1個DeleteRow操作。
private static void batchWriteRow(SyncClient client) {
BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
//構造rowPutChange1。
PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk1Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk1"));
RowPutChange rowPutChange1 = new RowPutChange(TABLE_NAME, pk1Builder.build());
//添加一些列。
for (int i = 0; i < 10; i++) {
rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowPutChange1);
//構造rowPutChange2。
PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk2Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk2"));
RowPutChange rowPutChange2 = new RowPutChange(TABLE_NAME, pk2Builder.build());
//添加一些列。
for (int i = 0; i < 10; i++) {
rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowPutChange2);
//構造rowUpdateChange。
PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk3Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk3"));
RowUpdateChange rowUpdateChange = new RowUpdateChange(TABLE_NAME, pk3Builder.build());
//添加一些列。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
//刪除一列。
rowUpdateChange.deleteColumns("Col10");
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowUpdateChange);
//構造rowDeleteChange。
PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk4Builder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString("pk4"));
RowDeleteChange rowDeleteChange = new RowDeleteChange(TABLE_NAME, pk4Builder.build());
//添加到batch操作中。
batchWriteRowRequest.addRowChange(rowDeleteChange);
BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
System.out.println("是否全部成功:" + response.isAllSucceed());
if (!response.isAllSucceed()) {
for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
System.out.println("失敗的行:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
System.out.println("失敗原因:" + rowResult.getError());
}
/**
* 可以通過createRequestForRetry方法再構造一個請求對失敗的行進行重試。此處只給出構造重試請求的部分。
* 推薦的重試方法是使用SDK的自訂重試策略功能,支援對batch操作的部分行錯誤進行重試。設定重試策略後,調用介面處無需增加重試代碼。
*/
BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
}
}
詳細代碼請參見BatchWriteRow@GitHub。