猿问

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

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

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

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


代码:


row_range := bigtable.PrefixRange("")


err = tbl.ReadRows(ctx,row_range, func(row bigtable.Row) bool {

// logic goes here

}, bigtable.RowFilter(bigtable.LatestNFilter(1)))


达令说
浏览 118回答 3
3回答

森林海

据我所知,这是正常的。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 专家能为您提供帮助。

萧十郎

这里似乎有点混乱:在任何情况下,ReadRows 都不应该返回重复的行键。假设电子表格中的行对应于客户端库在 func 回调中返回的行,那么这是客户端库中的错误。Bigtable 确实允许单元格值的多个版本。它提供像LatestNFilter()这样的过滤器来隐藏旧的单元格值,并提供gc规则来定期删除它们。但是,这仅限于单元格值,与行键无关。换句话说,Bigtable 提供单元版本而不是行版本。ApplyBulk 不是原子的,而且它不提供有关突变排序的任何保证。

MMTTMM

我认为错误来自ApplyBulk 转换“插入任务”的方式。
随时随地看视频慕课网APP

相关分类

Go
我要回答