Cloud Bigtable:按列过滤时,我的修改请求是原子的吗?

时间:2019-09-16 06:56:31

标签: python bigtable google-cloud-bigtable

在我的Cloud Bigtable表中,我每秒有数百万个请求。我得到了唯一的行键,然后需要用原子突变来修改行。

当我按列过滤以获取密钥时,它对于每个请求都是原子的吗?

col1_filter = row_filters.ColumnQualifierRegexFilter(b'customerId')
label1_filter = row_filters.ValueRegexFilter('')
chain1 = row_filters.RowFilterChain(filters=[col1_filter, label1_filter])

partial_rows = table.read_rows(filter_=chain1)

for data in partial_rows:
    row_cond = table.row(data.cell[row_key])
    row_cond.set_cell(u'data', b'customerId', b'value', state=True)
    row_cond.commit()

1 个答案:

答案 0 :(得分:2)

CheckAndMutateRow operations are atomic,但要检查并更改而不是行。因此,您进行此设置的方式将不会创建原子操作。

您需要使用行键和过滤器创建conditional row对象,提供修改,然后提交。像这样:

col1_filter = row_filters.ColumnQualifierRegexFilter(b'customerId')
label1_filter = row_filters.ValueRegexFilter('')
chain1 = row_filters.RowFilterChain(filters=[col1_filter, label1_filter])

partial_rows = table.read_rows()

for data in partial_rows:
    row_cond = table.row(data.cell[row_key], filter_=chain1) # Use filter here
    row_cond.set_cell(u'data', b'customerId', b'value', state=True)
    row_cond.commit()

因此,您将必须进行全表扫描并将过滤器应用于每一行。如果您要应用该过滤器,那么您已经在进行全面扫描,因此应该不会有性能差异。对于Cloud Bigtable的最佳做法,您要避免全表扫描。如果这是一个一次性程序,则需要运行该程序就可以了,否则,如果您要定期执行此操作,则可能想找出另一种方式来执行此操作。

请注意,我们updating the API会更清楚地说明不同类型的突变。