584
iPhone_iPad_Mac_手機_平板_蘋果apple
使用過濾器__最佳實踐_表格存儲-阿裏雲
過濾器 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-阿裏雲