Cloud Bigtable:当我按列过滤时,我的修改请求是原子的吗?
Cloud Bigtable: when I filter by column, are my modify requests atomic?
在我的 Cloud Bigtable table 中,我每秒有数百万个请求。我得到一个唯一的行键,然后我需要用原子突变修改该行。
当我按列过滤获取键时,它对每个请求都是原子的吗?
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()
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()
因此您必须进行完整的 table 扫描并将过滤器应用于每一行。如果您正在应用该过滤器,那么您已经在进行全面扫描,因此不应该存在性能差异。对于 Cloud Bigtable 的最佳实践,您希望避免完全 table 扫描。如果这是一个一次性程序,您需要 运行 就可以了,否则如果您要定期执行此操作,则可能需要找出一种不同的方法来执行此操作。
请注意,我们 updating the API 将更清楚地说明不同类型的突变。
在我的 Cloud Bigtable table 中,我每秒有数百万个请求。我得到一个唯一的行键,然后我需要用原子突变修改该行。
当我按列过滤获取键时,它对每个请求都是原子的吗?
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()
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()
因此您必须进行完整的 table 扫描并将过滤器应用于每一行。如果您正在应用该过滤器,那么您已经在进行全面扫描,因此不应该存在性能差异。对于 Cloud Bigtable 的最佳实践,您希望避免完全 table 扫描。如果这是一个一次性程序,您需要 运行 就可以了,否则如果您要定期执行此操作,则可能需要找出一种不同的方法来执行此操作。
请注意,我们 updating the API 将更清楚地说明不同类型的突变。