584
阿里云
使用过滤器__最佳实践_表格存储-阿里云
过滤器 Filter 可以在服务端对读取的结果再进行一次过滤,根据 Filter 中的条件决定返回哪些行。由于只返回了符合条件的数据行,所以在大部分场景下,可以有效降低网络传输的数据量,减少响应时间。
表格存储 Filter 的过滤条件支持算术运算(=、!=、>、>=、<、<=)和逻辑运算(NOT、AND、OR),支持最多 10 个条件的组合,可以用于 GetRow、BatchGetRow 和 GetRange 接口中。
使用说明
目前表格存储仅支持 SingleColumnValueFilter 和 CompositeColumnValueFilter,这两个 Filter 都是基于参考列的列值决定某行是否会被过滤掉。前者只判断某个参考列的列值,后者会对多个参考列的列值判断结果进行逻辑组合,决定最终是否过滤。
API 文档参考:ColumnCondition。
构造 SingleColumnValueFilter。
// 设置过滤器, 当 Col0 的值为 0 时返回该行。
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
// 如果不存在 Col0 这一列, 也不返回。
singleColumnValueFilter.setPassIfMissing(false);
构造 CompositeColumnValueFilter。
// composite1 条件为 (Col0 == 0) AND (Col1 > 100)
CompositeColumnValueFilter composite1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
SingleColumnValueFilter single1 = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
SingleColumnValueFilter single2 = new SingleColumnValueFilter("Col1",
SingleColumnValueFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
composite1.addFilter(single1);
composite1.addFilter(single2);
// composite2 条件为 ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10)
CompositeColumnValueFilter composite2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
SingleColumnValueFilter single3 = new SingleColumnValueFilter("Col2",
SingleColumnValueFilter.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
composite2.addFilter(composite1);
composite2.addFilter(single3);
需要注意的是,Filter 是对读取后的结果再进行一次过滤,所以 SingleColumnValueFilter 或者 CompositeColumnValueFilter 中的参考列必须在读取的结果内,如果用户指定了要读取的列,且其中不包含参考列,那么 Filter 无法获得这些参考列的值。当某个参考列不存在时,SingleColumnValueFilter 的 passIfMissing 参数决定此时是否满足条件,即用户可以选择当参考列不存在时的行为。
使用场景示例
以物联网中的智能电表为例,智能电表按一定的频率(比如每隔 15 秒)将当前的电压、电流、度数等信息写入表格存储。在按天做分析的时候,我们需要拿到某一个电表当天是否出现过电压异常以及出现时的其他状态数据,看是否需要对某条线路进行检修。
按照目前的方案,使用 GetRange 读取一个电表一天内的所有的监控数据,共有 5760 条之多,然后再对这 5760 条信息进行过滤,拿到了最终的 10 个电压出现不稳定时的监控信息。
使用过滤器 Filter 只返回了实际需要的 10 条数据,大大降低了返回的数据量,另外一方便,不需要再对结果进行初步的过滤处理,节省了开发代价。
费用计算
使用过滤器 Filter 之后,虽然有效降低了返回的数据量,但由于服务器端进行过滤计算是在数据返回给用户之前进行的,并没有降低磁盘 IO 次数,所以消耗与不使用过滤器情况下相同数量的读 CU,即使用过滤器与否不影响 CU 计算。
比如,使用 GetRange 读取到 100 条记录,共 200 KB 数据,共消耗了 50 个读 CU,在使用了过滤器之后,实际返回了 10 条数据,共 20 KB,但仍然会消耗 50 个读 CU。
特别说明
在 GetRow、BatchGetRow 和 GetRange 接口中使用过滤器除了不影响费用计算外,也不会改变使用接口的原生语义及限制项设定。
使用 GetRange 接口时,会受到一次返回数据的行数超过 5000 行或者返回数据的数据大小大于 4 MB 的限制,当在该次返回的 5000 行或者 4 MB 数据中没有满足 Filter 过滤条件的记录时,得到的 Response 中的 Rows 为空,但是 next_start_primary_key 可能不为空,此时需要使用 next_start_primary_key 继续读取数据,直到 next_start_primary_key 为空。详情请参见 GetRange 接口说明。
最后更新:2016-11-23 17:16:09
上一篇:
使用条件更新__最佳实践_表格存储-阿里云
下一篇:
宽行读取__最佳实践_表格存储-阿里云
UpdateRowInBatchWriteRowRequest__DataType_API 参考_表格存储-阿里云
数据导入__快速入门_云数据库 Redis 版-阿里云
如何通过企业对公帐号打款认证完成企业实名认证__实名认证_帐号实名认证_会员账号&实名认证-阿里云
伸缩活动的流程__使用须知_用户指南_弹性伸缩-阿里云
ECS云服务器自动快照FAQ
ALIYUN::ROS::WaitCondition__资源列表_资源编排-阿里云
设置内外网地址__网络管理_用户指南_云数据库 RDS 版-阿里云
DeleteLoginProfile__用户管理接口_RAM API文档_访问控制-阿里云
多线程下载示例__SDK示例_批量数据通道_大数据计算服务-阿里云
CDN API鉴权规则__RAM资源授权-CDN_API 手册_CDN-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云