为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
达令说 2023-07-10 15:00:10
我正在使用 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)))
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

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


查看完整回答
反对 回复 2023-07-10
?
萧十郎

TA贡献1815条经验 获得超12个赞

这里似乎有点混乱:

  1. 在任何情况下,ReadRows 都不应该返回重复的行键。假设电子表格中的行对应于客户端库在 func 回调中返回的行,那么这是客户端库中的错误。

  2. Bigtable 确实允许单元格值的多个版本。它提供像LatestNFilter()这样的过滤器来隐藏旧的单元格值,并提供gc规则来定期删除它们。但是,这仅限于单元格值,与行键无关。换句话说,Bigtable 提供单元版本而不是行版本。

  3. ApplyBulk 不是原子的,而且它不提供有关突变排序的任何保证。


查看完整回答
反对 回复 2023-07-10
?
MMTTMM

TA贡献1869条经验 获得超4个赞

我认为错误来自ApplyBulk 转换“插入任务”的方式。


查看完整回答
反对 回复 2023-07-10
  • 3 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信