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

2024-10-17 06:18:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当我按列筛选以获取密钥时,它对每个请求都是原子的吗?你知道吗

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()

Tags: datatablecellfilterpartialfilterscol1rows
1条回答
网友
1楼 · 发布于 2024-10-17 06:18:35

CheckAndMutateRow operations are atomic,但它是check和mutaterownot rows。所以你设置的方式不会创建原子操作。你知道吗

您需要使用rowkey和过滤器创建一个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()

因此,您必须进行一次完整的表扫描,并对每一行应用过滤器。如果你正在应用这个过滤器,你已经在做一个完整的扫描了,所以不应该有性能上的差异。对于cloudbigtable的最佳实践,您希望避免全表扫描。如果这是一个一次性的程序,你需要运行这将是好的,否则你可能想找出一个不同的方法来做这件事,如果你要经常这样做。你知道吗

请注意,我们将updating the API提供关于不同类型突变的更清晰的信息。你知道吗

相关问题 更多 >