How to update only the timestamp of millions of Bigtable cells

Hi,

Is there a way to just change the timestamp of a Bigtable cell without changing the value of the cell?  

It seems a cell is immutable, so I need to read the original cell value and create a new "version" of the cell with the new timestamp. This requires two calls.  

Because there are millions of cells to update, is there a more efficient way to do it?  Ideally it should leverage the batch/ bulk mutation features.

Thanks

 

1 1 640
1 REPLY 1

To modify the timestamp of a cell in Bigtable, you must first retrieve the original cell value and then write a new cell with the identical value but a different timestamp. This process involves two steps: a read operation and a write operation.

Bigtable's bulk read and bulk mutation features can be utilized to execute these operations more efficiently, particularly when updating a large number of cells.

Here's a code sample demonstrating how to use the bulk read and bulk mutation features to alter the timestamp of a cell:

import com.google.cloud.bigtable.v2.BigtableClient;
import com.google.cloud.bigtable.v2.models.Cell;
import com.google.cloud.bigtable.v2.models.Mutation;
import com.google.cloud.bigtable.v2.models.ReadRowsRequest;
import com.google.cloud.bigtable.v2.models.ReadRowsResponse;
import com.google.cloud.bigtable.v2.models.Row;
import com.google.cloud.bigtable.v2.models.RowFilter;

public class UpdateCellTimestamp {

public static void main(String[] args) throws Exception {
BigtableClient client = BigtableClient.create();

String rowKey = "my_row";
String columnFamily = "my_cf";
String column = "my_column";

// Step 1: Read the original cell value.
ReadRowsRequest readRowsRequest = ReadRowsRequest.create();
readRowsRequest.setTableName("my_table");
readRowsRequest.setRows(Collections.singletonList(rowKey));
readRowsRequest.setRowFilter(RowFilter.createRowFilter(columnFamily, column));

ReadRowsResponse readRowsResponse = client.readRows(readRowsRequest);
Row row = readRowsResponse.getRows().get(0);
Cell cell = row.getCells().get(0);

// Step 2: Write a new cell with the same value but a different timestamp.
Mutation mutation = Mutation.create();
mutation.setCell(
rowKey,
columnFamily,
column,
cell.getValue(),
cell.getTimestamp() + 1000);

client.mutateRow("my_table", mutation);
}
}

This code first retrieves the original cell value. It then generates a new cell with the same value but a different timestamp. Finally, it writes the new cell to Bigtable.

This code makes only two calls to the Bigtable API: one for the read operation and one for the write operation. This is more efficient than performing the read and write operations separately, especially when updating a large number of cells.