表格存储支持在服务端按指定条件过滤数据,查询时只返回符合条件的行。本文介绍如何在 Python SDK中使用过滤器。
前提条件
使用过滤器前,需完成以下准备:
过滤器工作原理
过滤器在服务端扫描完主键范围内的行之后执行。无论某行是否通过过滤条件,扫描该行均会消耗读取 CU。因此,过滤器适合在已缩小主键范围的基础上进一步筛选数据,不建议用于过滤大量行以获取少量结果。
表格存储提供两种过滤器类型:
SingleColumnCondition:对单个属性列的值进行条件判断。适用于基于某一列值的简单过滤场景。CompositeColumnCondition:将多个条件通过逻辑运算符(AND、OR、NOT)组合。适用于多列联合过滤或复杂条件判断场景,最多支持 32 个条件组合。
SingleColumnCondition
对单个属性列的值进行关系运算,判断该列是否满足过滤条件。
class SingleColumnCondition(ColumnCondition)
示例代码
以下示例通过范围查询获取主键在 [row1, row3) 范围内的行数据,并过滤出 col1 属性列的值等于 val1 的行。
try:
# 设置查询起始主键
inclusive_start_primary_key = [('id', 'row1')]
# 设置查询结束主键(返回结果不包含结束主键)
exclusive_end_primary_key = [('id', 'row3')]
# 构造过滤器,条件为 col1 == "val1"
singleColumnCondition = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# 调用 get_range 方法查询数据
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=singleColumnCondition)
# 返回结果处理
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("Range get failed with error: %s" % e)
-
行数据不包含判断的属性列时,不返回该行:
singleColumnCondition.pass_if_missing = False -
判断所有版本的数据,任意版本满足条件即返回该行:
singleColumnCondition.latest_version_only = False
CompositeColumnCondition
将多个过滤条件通过逻辑运算符组合,支持 SingleColumnCondition 和 CompositeColumnCondition 嵌套,最多支持 32 个条件的组合。
class CompositeColumnCondition(ColumnCondition)
示例代码
以下示例通过范围查询获取主键在 [row1, row3) 范围内的行数据,并应用如下组合过滤条件:
(col1 == "val1" OR col2 == "val2") AND col3 == "val3"
try:
# 设置查询起始主键
inclusive_start_primary_key = [('id', 'row1')]
# 设置查询结束主键(返回结果不包含结束主键)
exclusive_end_primary_key = [('id', 'row3')]
# 构造单属性列值过滤器1,条件为 col1 == "val1"
singleColumnCondition1 = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# 构造单属性列值过滤器2,条件为 col2 == "val2"
singleColumnCondition2 = SingleColumnCondition('col2', 'val2', ComparatorType.EQUAL)
# 构造组合过滤器1,条件为 col1 == "val1" OR col2 == "val2"
compositeColumnCondition1 = CompositeColumnCondition(LogicalOperator.OR)
compositeColumnCondition1.add_sub_condition(singleColumnCondition1)
compositeColumnCondition1.add_sub_condition(singleColumnCondition2)
# 构造单属性列值过滤器3,条件为 col3 == "val3"
singleColumnCondition3 = SingleColumnCondition('col3', 'val3', ComparatorType.EQUAL)
# 构造组合过滤器2,条件为 (col1 == "val1" OR col2 == "val2") AND col3 == "val3"
compositeColumnCondition2 = CompositeColumnCondition(LogicalOperator.AND)
compositeColumnCondition2.add_sub_condition(compositeColumnCondition1)
compositeColumnCondition2.add_sub_condition(singleColumnCondition3)
# 调用 get_range 方法查询数据
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=compositeColumnCondition2)
# 返回结果处理
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("Range get failed with error: %s" % e)
相关文档
该文章对您有帮助吗?