BigTable ReadModifyWriteRow 支持映射函数

BigTable ReadModifyWriteRow Support for Mapping Function

我知道 BigTable 支持使用 ReadModifyWriteRow 请求的 appendincrement 操作,但我想知道是否有支持或替代方法来使用更通用的映射函数可以在某种闭包中访问和修改单元格的值在哪里?例如,按位 ANDing 一个单元格中的 long 值:

Function<Long, Long> modifyFunc = f -> f & 10L;

ReadModifyWriteRow
  .create("tableName", "rowKey")
  .apply("family", "qualifier", modifyFunc);

Bigtable 不支持像这样进行映射,因此您可以尝试以下选项。由于需要一致性,这仅适用于单个集群实例。

您可以添加一列来跟踪行版本(除了现有的行版本之外),然后您可以读取数据和版本,在内存中修改它,然后使用版本和新值执行 checkAndMutate .像这样:

Row row = dataClient.readRow(tableId, rowkey);
ArrayList<RowCell> cells = row.getCells();

// Get the value and timestamp/version from the cell you are targetting.
RowCell cell = cells.get(...);
long version = cell.getTimestamp();
ByteString value = cell.getValue();

// Do your mapping to the new value.
ByteString newValue = ...;

Mutation mutation =
    Mutation.create().setCell(COLUMN_FAMILY_NAME, COLUMN_NAME, timestamp, newValue);

// Filter on a column that tracks the version to do validation.
Filter filter =
    FILTERS
        .chain()
        .filter(FILTERS.family().exactMatch(COLUMN_FAMILY_NAME))
        .filter(FILTERS.qualifier().exactMatch(VERSION_COLUMN))
        .filter(FILTERS.value().exactMatch(version));

ConditionalRowMutation conditionalRowMutation =
    ConditionalRowMutation.create(tableId, rowkey).condition(filter).then(mutation);

boolean success = dataClient.checkAndMutateRow(conditionalRowMutation);