Tablestore では、1 行または複数行のデータを同時に書き込むことで、データテーブルにデータを書き込むことができます。ビジネス要件に基づいて、行を個別に書き込んだり、複数行のデータを同時に書き込んだりできます。このトピックでは、Tablestore SDK for Java を使用して Tablestore にデータを書き込む方法について説明します。
前提条件
Tablestore クライアントが初期化されていること。詳細については、「Tablestore クライアントを初期化する」をご参照ください。
Tablestore インスタンスにデータテーブルが作成されていること。
書き込みメソッド
Tablestore では、異なる操作を呼び出すことで、単一行のデータの書き込み、単一行のデータの更新、複数行のデータの同時書き込みを実行できます。次の表に、書き込みメソッドの違いと適用可能なシナリオを示します。
書き込みメソッド | 説明 | シナリオ |
PutRow 操作を呼び出して、単一行のデータを書き込みます。 | このメソッドは、少量のデータを書き込む場合に適しています。 | |
UpdateRow 操作を呼び出して、単一行のデータを更新できます。 | このメソッドは、少量のデータを更新する場合に適しています。 | |
BatchWriteRow 操作を呼び出して、1 つ以上のテーブルに複数行のデータを同時に書き込むことができます。 | このメソッドは、大量のデータを書き込み、削除、または更新する場合や、データを同時に書き込み、削除、および更新する場合に適しています。 |
パラメーター
次の表に、Tablestore にデータを書き込むために設定できるパラメーターを示します。
パラメーター | 説明 |
tableName | データテーブルの名前。 |
primaryKey | データテーブルに関するプライマリキー情報。プライマリキー情報には、各プライマリキー列の名前、型、および値が含まれます。 重要
|
column | 属性列に関する情報。属性列に関する情報には、各属性列の名前、値、型、およびタイムスタンプが含まれます。型とタイムスタンプはオプションです。
説明
|
condition | データを書き込むために満たす必要がある条件。条件は、行の有無の条件、または列の値に基づく条件を指定できます。詳細については、「条件付き更新を実行する」をご参照ください。 |
単一行のデータの書き込み
PutRow 操作を呼び出して、単一行のデータを書き込むことができます。行が存在する場合、PutRow 操作は既存の行のすべての列にあるすべてのバージョンのデータを削除してから、新しいデータを書き込みます。
この例では、pkValue はプライマリキー列の値を表します。 pkValue はビジネス要件に基づいて指定します。データテーブルにデータを書き込むには、完全なプライマリキー情報と、書き込む属性列に関する情報を指定する必要があります。データテーブルにデータを書き込むために満たす必要がある条件を指定できます。たとえば、指定した行が存在しない場合にのみ、データテーブルにデータを書き込むことができるように指定できます。
次のサンプルコードは、システムによって自動的に生成されるデータバージョン番号を使用する方法、カスタムデータバージョン番号を指定する方法、およびデータテーブルにデータを書き込むために満たす必要がある条件を指定する方法の例を示しています。
システムによって自動的に生成されるデータバージョン番号を使用する
次のサンプルコードは、それぞれが 1 つのバージョンのデータのみを格納する 10 個の属性列を含む行を書き込む方法の例を示しています。この例では、データバージョン番号はシステムによって自動的に生成されます。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// データテーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("your_tableName", primaryKey);
// 属性列を追加します。
for (int i = 0; i < 10; i++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
client.putRow(new PutRowRequest(rowPutChange));
}カスタムデータバージョン番号を指定する
次のサンプルコードは、それぞれが 3 つのバージョンのデータを格納する 10 個の属性列を含む行を書き込む方法の例を示しています。この例では、カスタムデータバージョン番号が指定されています。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// データテーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("your_tableName", 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 個の属性列を含む行を書き込む方法の例を示しています。この例では、カスタムデータバージョン番号が指定されています。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// データテーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("your_tableName", primaryKey);
// PutRow 操作の条件を指定します。この例では、指定した行が存在しない場合にのみ、データテーブルにデータが書き込まれます。
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));
}列値条件と行存在条件を同時に指定する
次のサンプルコードは、指定された行が存在し、Col0 列の値が 100 より大きい場合に、それぞれが 3 つのバージョンのデータを格納する 10 個の属性列を含む行を書き込む方法の例を示しています。この例では、カスタムデータバージョン番号が指定されています。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// データテーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("your_tableName", primaryKey);
// PutRow 操作の条件を指定します。この例では、行が存在し、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));
}単一行のデータの更新
UpdateRow 操作を呼び出して、単一行のデータを更新できます。属性列の値の更新、属性列の追加と削除、または属性列から特定のバージョンのデータの削除を実行できます。行が存在しない場合は、新しい行が追加されます。
UpdateRow 操作で行から削除する列のみを指定し、行が存在しない場合、データテーブルに行は追加されません。
次のサンプルコードは、行の更新を満たす必要がある条件が指定されている場合と指定されていない場合に、特定の列を更新する方法、Col1 列から特定のバージョンのデータを削除する方法、および Col0 列を削除する方法の例を示しています。
条件を指定せずにデータ行を更新する
次のサンプルコードは、満たす必要がある条件を指定せずにデータ行を更新する方法の例を示しています。
private static void updateRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// データテーブルの名前を指定します。
RowUpdateChange rowUpdateChange = new RowUpdateChange("your_tableName", primaryKey);
// 特定の列を更新します。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列から特定のバージョンのデータを削除します。
rowUpdateChange.deleteColumn("Col1", 1465373223000L);
// 列を削除します。
rowUpdateChange.deleteColumns("Col0");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}行の有無の条件または列の値に基づく条件を指定してデータを更新する
次のサンプルコードは、指定した行が存在し、Col0 列の値が 100 より大きい場合にのみデータ行を更新する方法の例を示しています。
private static void updateRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// データテーブルの名前を指定します。
RowUpdateChange rowUpdateChange = new RowUpdateChange("your_tableName", primaryKey);
// UpdateRow 操作の条件を指定します。この例では、行が存在し、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("Col1", 1465373223000L);
// 列を削除します。
rowUpdateChange.deleteColumns("Col0");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}複数行のデータの同時書き込み
BatchWriteRow 操作を呼び出して、1 つ以上のテーブルに複数行のデータを同時に書き込むことができます。
BatchWriteRow 操作は、複数の PutRow、UpdateRow、および DeleteRow 操作で構成されます。 BatchWriteRow 操作を呼び出す場合、サブ操作を構築するプロセスは、PutRow、UpdateRow、または DeleteRow 操作を呼び出すプロセスと同じです。 BatchWriteRow 操作を呼び出すと、各 PutRow、UpdateRow、または DeleteRow 操作は個別に実行され、各操作への応答は Tablestore によって個別に返されます。
BatchWriteRow 操作では、同時リクエスト数に上限はありません。クライアントの仕様とリソースの状態に基づいて同時リクエスト数を設定し、効率的かつ安定したコード実行を確保することをお勧めします。
サーバーが特定の操作に無効なパラメーターが存在することを検出した場合、BatchWriteRow 操作は、無効なパラメーターを示す例外をスローします。この場合、リクエスト内の操作は実行されません。
BatchWriteRow 操作を呼び出して複数行のデータを同時に書き込むと、一部の行の書き込みに失敗する場合があります。この場合、Tablestore は BatchWriteRowResponse を返します。これには、失敗した行のインデックスとエラーメッセージが含まれます。戻り値を確認することをお勧めします。 BatchWriteRowResponse の
isAllSucceedパラメーターに基づいて、すべての行がデータテーブルに書き込まれたかどうかを判断できます。
次のサンプルコードは、2 つの PutRow 操作、1 つの DeleteRow 操作、および 1 つの UpdateRow 操作で構成される BatchWriteRow 操作のリクエストを送信する方法の例を示しています。
private static void batchWriteRow(SyncClient client) {
BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
// 最初の rowPutChange を構築します。
PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk1Builder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString("pkValue1"));
// データテーブルの名前を指定します。
RowPutChange rowPutChange1 = new RowPutChange("your_tableName", pk1Builder.build());
// 列を追加します。
for (int i = 0; i < 10; i++) {
rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// バッチ操作のコードに rowPutChange1 を追加します。
batchWriteRowRequest.addRowChange(rowPutChange1);
// 2 番目の rowPutChange を構築します。
PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk2Builder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString("pkValue2"));
// データテーブルの名前を指定します。
RowPutChange rowPutChange2 = new RowPutChange("your_tableName", pk2Builder.build());
// 列を追加します。
for (int i = 0; i < 10; i++) {
rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// バッチ操作のコードに rowPutChange2 を追加します。
batchWriteRowRequest.addRowChange(rowPutChange2);
// rowUpdateChange を構築します。
PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk3Builder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString("pkValue3"));
// データテーブルの名前を指定します。
RowUpdateChange rowUpdateChange = new RowUpdateChange("your_tableName", pk3Builder.build());
// 列を追加します。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列を削除します。
rowUpdateChange.deleteColumns("Col0");
// バッチ操作のコードに rowUpdateChange を追加します。
batchWriteRowRequest.addRowChange(rowUpdateChange);
// rowDeleteChange を構築します。
PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk4Builder.addPrimaryKeyColumn("your_primaryKey", PrimaryKeyValue.fromString("pkValue4"));
// データテーブルの名前を指定します。
RowDeleteChange rowDeleteChange = new RowDeleteChange("your_tableName", pk4Builder.build());
// バッチ操作のコードに rowDeleteChange を追加します。
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 メソッドを使用して、別のリクエストを構築し、失敗した行の操作を再試行できます。この例では、再試行リクエストのみが構築されます。
* 再試行方法として、Tablestore SDK のカスタム再試行ポリシーを使用することをお勧めします。このようにして、バッチ操作の実行後に失敗した行を再試行できます。再試行ポリシーを指定した後、操作を呼び出すために再試行コードを追加する必要はありません。
*/
BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
}
}FAQ
関連情報
Tablestore データ操作を実行するために使用できるサンプルコードの詳細については、GitHub のサンプルコードにアクセスしてください。
さまざまなページのページビュー (PV) 数など、オンライン アプリケーションに関するリアルタイム統計情報を収集するには、アトミックカウンター機能を使用できます。詳細については、「アトミックカウンター機能を使用する」をご参照ください。
1 つ以上のデータ行を書き込むためのアトミック操作を実行するには、ローカルトランザクション機能を使用できます。詳細については、「ローカルトランザクション機能を使用する」をご参照ください。