我正在使用Go库写入BigTable。我使用ApplyBulk方法原子地进行多个插入。但是,当我使用ReadRows函数查询BigTable时,我看到具有相同行键的多个副本/版本。

例如:在下面提到的示例中,我看到同一个RowKey的多个副本以及部分数据,最后一次出现的所有列都包含所有字段。

go - Cloud BigTable存储同一行键的多个副本-LMLPHP

如何确保每个行键只存储一个数据副本?以及如何仅获取插入的行的最新版本?

代码:

row_range := bigtable.PrefixRange("")

err = tbl.ReadRows(ctx,row_range, func(row bigtable.Row) bool {
// logic goes here
}, bigtable.RowFilter(bigtable.LatestNFilter(1)))

最佳答案

据我所知,这很正常。 CBT存储该行键的历史记录,您需要通过一个过滤器以获取最新的。

bigtable.RowFilter(bigtable.LatestNFilter(1))

更新:,这就是我使用该过滤器的方式

    rowName := "myrow#key#id"
    row, err := bt.Table.ReadRow(ctx, rowName, bigtable.RowFilter(bigtable.LatestNFilter(1)))
    if err != nil {
        // handle error...
    }
    if row == nil {
        // check for 0 result...
    }


更新2:

根据您的代码,改用ReadRows,看起来您正在尝试获取多个行键。因此您的代码应为每个行键提取最新行。

如果您只想在图像中显示一个键,那么我将使用ReadRow方法代替。

err = tbl.ReadRow(ctx,"1564:u2Sng4xbtG", bigtable.RowFilter(bigtable.LatestNFilter(1)))

否则,我想它在CBT中的存储方式可能会出现问题,但这有点超出我的CBT技能范围。希望CBT专家能为您服务。

关于go - Cloud BigTable存储同一行键的多个副本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57363210/

10-14 03:57