すべてのプロダクト
Search
ドキュメントセンター

Tablestore:データの書き込み

最終更新日:Dec 28, 2024

Tablestoreでは、1 行または複数行のデータを同時に書き込むことで、データテーブルにデータを書き込むことができます。ビジネス要件に基づいて、行を個別に書き込むことも、複数行のデータを同時に書き込むこともできます。このトピックでは、Tablestore SDK for Java を使用して Tablestore にデータを書き込む方法について説明します。

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスの初期化を参照してください。

  • Tablestore インスタンスにデータテーブルが作成されていること。

書き込み方法

Tablestoreでは、異なる操作を呼び出すことで、単一行のデータの書き込み、単一行のデータの更新、および複数行のデータの同時書き込みを行うことができます。次の表に、書き込み方法の違いと適用可能なシナリオを示します。

書き込み方法

説明

シナリオ

単一行のデータの書き込み

PutRow 操作を呼び出して、1 行のデータを書き込みます。

この方法は、少量のデータを書き込む場合に適しています。

単一行のデータの更新

UpdateRow 操作を呼び出して、単一のデータ行を更新します。

この方法は、少量のデータを更新する場合に適しています。

複数行のデータの同時書き込み

BatchWriteRow 操作を呼び出して、複数の行のデータを 1 つ以上のテーブルに同時に書き込むことができます。

この方法は、大量のデータを書き込み、削除、または更新する場合、およびデータを同時に書き込み、削除、および更新する場合に適しています。

パラメータ

次の表に、Tablestore にデータを書き込むために設定できるパラメータを示します。

パラメータ

説明

tableName

データテーブルの名前。

primaryKey

データテーブルに関するプライマリキー情報。プライマリキー情報には、各プライマリキー列の名前、タイプ、および値が含まれます。

重要
  • 指定するプライマリキー列の数とタイプは、テーブル内のプライマリキー列の実際の数とタイプと同じである必要があります。

  • 主キー列が自動インクリメント主キー列である場合は、自動インクリメント主キー列の値をプレースホルダーに設定します。詳細については、自動インクリメント主キー列の構成を参照してください。

column

属性列に関する情報。属性列に関する情報には、各属性列の名前、値、タイプ、およびタイムスタンプが含まれます。タイプとタイムスタンプはオプションです。

  • 属性列の名前。属性列の名前は、1 ~ 255 文字で、文字、数字、およびアンダースコア (_) を使用できます。名前は大文字と小文字が区別され、数字で始めることはできません。

  • 属性列のタイプ。属性列のタイプは、String、Integer、Binary、Floating-point、または Boolean にすることができます。

  • タイムスタンプはデータバージョン番号です。データバージョン番号はシステムによって自動的に生成されます。カスタムデータバージョン番号を指定することもできます。詳細については、データバージョンとTTLを参照してください。

説明
  • 属性列を削除するには、属性列の名前のみを指定します。

  • 属性列から特定のバージョンのデータを削除するには、属性列の名前とタイムスタンプを指定します。

  • 行からすべての属性列を削除した後も、行は引き続き存在します。行を削除するには、DeleteRow オペレーションを呼び出します。詳細については、データの削除を参照してください。

condition

データを書き込むために満たす必要がある条件。条件は、行の有無の条件、または列の値に基づく条件にすることができます。詳細については、条件付き更新の実行を参照してください。

単一行のデータの書き込み

PutRow 操作を呼び出して、単一行のデータを書き込むことができます。行が存在する場合、PutRow 操作は既存の行のすべての列にあるすべてのバージョンのデータを削除してから、新しいデータを書き込みます。

説明

この例では、pkValue はプライマリキー列の値を表します。ビジネス要件に基づいて pkValue を指定します。データテーブルにデータを書き込むには、完全なプライマリキー情報と、書き込む属性列に関する情報を指定する必要があります。データテーブルにデータを書き込むために満たす必要がある条件を指定できます。たとえば、指定した行が存在しない場合にのみ、データテーブルにデータを書き込むことができるように指定できます。

次のサンプルコードは、システムによって自動的に生成されるデータバージョン番号を使用する方法、カスタムデータバージョン番号を指定する方法、およびデータテーブルにデータを書き込むために満たす必要がある条件を指定する方法の例を示しています。

システムによって自動的に生成されるデータバージョン番号を使用する

次のサンプルコードは、それぞれが1つのバージョンのデータのみを格納する10個の属性列を含む行を書き込む方法の例を示しています。この例では、データバージョン番号はシステムによって自動的に生成されます。

// プライマリキーを構築します。
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個の属性列を含む行を書き込む方法の例を示しています。この例では、カスタムデータバージョン番号が指定されています。

// プライマリキーを構築します。
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個の属性列を含む行を書き込む方法の例を示しています。この例では、カスタムデータバージョン番号が指定されています。

// プライマリキーを構築します。
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 個の属性列を含む行を書き込む方法の例を示しています。この例では、カスタムデータバージョン番号が指定されています。

// プライマリキーを構築します。
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 列を削除する方法の例を示しています。

条件を指定せずにデータの行を更新する

次のサンプルコードは、満たす必要がある条件を指定せずにデータの行を更新する方法の例を示しています。

// プライマリキーを構築します。
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 より大きい場合にのみデータの行を更新する方法の例を示しています。

// プライマリキーを構築します。
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 操作を呼び出して複数行のデータを同時に書き込むと、一部の行の書き込みに失敗することがあります。この場合、Tablestore は BatchWriteRowResponse を返します。これには、失敗した行のインデックスとエラーメッセージが含まれます。戻り値を確認することをお勧めします。BatchWriteRowResponse の isAllSucceed パラメータに基づいて、すべての行がデータテーブルに書き込まれたかどうかを判断できます。

次のサンプルコードは、2 つの PutRow 操作、1 つの DeleteRow 操作、および 1 つの UpdateRow 操作で構成される BatchWriteRow 操作のリクエストを送信する方法の例を示しています。

// バッチ書き込みリクエストを作成
BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();

// 1 番目の 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 のサンプルコードにアクセスしてください。

  • BatchWriteRow オペレーションを呼び出すことで、最大 200 行のデータを同時に書き込むことができます。200 行を超えるデータを同時に書き込むには、TableStoreWriter を使用します。詳細については、TableStoreWriter を使用してデータを同時に書き込むを参照してください。

  • オンラインアプリケーションに関するリアルタイム統計 (さまざまなページのページビュー (PV) 数など) を収集するには、アトミックカウンター機能を使用できます。詳細については、アトミックカウンター機能の使用を参照してください。

  • 1 つ以上のデータ行を書き込むためのアトミック操作を実行するには、ローカル トランザクション機能を使用できます。詳細については、ローカル トランザクション機能の使用を参照してください。