【问题标题】:Bigtable: mutating multiple values into single column in a single column familyBigtable:将多个值更改为单个列族中的单个列
【发布时间】:2022-01-18 10:55:20
【问题描述】:

我尝试在行键test-123 中的列族test_cf 中的列test_col 中插入100 个值

问题是我成功地将 100 个值插入到 Bigtable 中。

但是,test_cf 中的test_col 列中的值的数量少于 100,并且似乎是随机插入的。

我写的代码如下。

rows = []
values = ['123-123124-325324', '543-123-45324-123123', '292-123124-54324-234', '292-213123-123123123-3213']
 # ...  100 values in the list

row_key = 'test-123'.encode()
direct_row = table.direct_row(row_key)
for val in values:
    row.set_cell("test_cf",
                 "test_col".encode('utf-8'),
                 val,
                 datetime.utcnow())
     
    rows.append(row)

rtn = table.mutate_rows(rows)

for i, status in enumerate(rtn):
    if status.code != 0:
        print('ERROR')

奇怪的是,对于 100 个值的突变,响应状态始终为 0。

【问题讨论】:

    标签: google-cloud-bigtable bigtable


    【解决方案1】:
    推荐的答案 Google Cloud

    此代码没有按照您的预期进行。每个set_cell 调用都写入同一行(“test-123”)、同一列族(“test_cf”)和同一列限定符(“test_col”)。该值每次都不同,但与每个值关联的时间戳是当前时间,在多个set_cells 中可能是相同的。因为 Bigtable 中的单个单元格由(行、族、列、时间戳)元组索引,所以此代码可以覆盖它在循环中较早写入的数据。

    所以,前 3 个set_cells 完全有可能是这样的:

    row:       "test-123"
    family:    "test_cf"
    column:    "test_col"
    value:     "123-123124-325324"
    timestamp: t0
    
    row:       "test-123"
    family:    "test_cf"
    column:    "test_col"
    value:     "543-123-45324-123123"
    timestamp: t0
    
    row:       "test-123"
    family:    "test_cf"
    column:    "test_col"
    value:     "292-123124-54324-234"
    timestamp: t1
    

    在这种情况下,第二个条目会覆盖第一个条目,因为(行、族、列、时间戳)是相同的。

    成功调用的状态码将为0,因此按预期工作。

    【讨论】:

    • 非常感谢您告诉我Bigtable的索引结构。我将尝试另一种方法来插入具有相同列限定符的值。
    • 当然可以。两个建议:使用计数器而不是实际时间作为时间戳,或者跟踪您设置的最后一个时间戳,如果新时间戳相同或更小,则将其增加 1 微秒。
    • 好建议!我选择将其增加 1 微秒以插入一个单元格,同时避免该问题。谢谢!
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2022-06-23
    • 2021-08-12
    • 2020-04-15
    • 2023-03-26
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多