閱讀584 返回首頁    go 人物


使用過濾器__最佳實踐_表格存儲-阿裏雲

過濾器 Filter 可以在服務端對讀取的結果再進行一次過濾,根據 Filter 中的條件決定返回哪些行。由於隻返回了符合條件的數據行,所以在大部分場景下,可以有效降低網絡傳輸的數據量,減少響應時間。

表格存儲 Filter 的過濾條件支持算術運算(=、!=、>、>=、<、<=)和邏輯運算(NOT、AND、OR),支持最多 10 個條件的組合,可以用於 GetRowBatchGetRowGetRange 接口中。

使用說明

目前表格存儲僅支持 SingleColumnValueFilter 和 CompositeColumnValueFilter,這兩個 Filter 都是基於參考列的列值決定某行是否會被過濾掉。前者隻判斷某個參考列的列值,後者會對多個參考列的列值判斷結果進行邏輯組合,決定最終是否過濾。

API 文檔參考:ColumnCondition

  1. 構造 SingleColumnValueFilter。

    1. // 設置過濾器, 當 Col0 的值為 0 時返回該行。
    2. SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
    3. SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
    4. // 如果不存在 Col0 這一列, 也不返回。
    5. singleColumnValueFilter.setPassIfMissing(false);
  2. 構造 CompositeColumnValueFilter。

    1. // composite1 條件為 (Col0 == 0) AND (Col1 > 100)
    2. CompositeColumnValueFilter composite1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND);
    3. SingleColumnValueFilter single1 = new SingleColumnValueFilter("Col0",
    4. SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
    5. SingleColumnValueFilter single2 = new SingleColumnValueFilter("Col1",
    6. SingleColumnValueFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
    7. composite1.addFilter(single1);
    8. composite1.addFilter(single2);
    9. // composite2 條件為 ( (Col0 == 0) AND (Col1 > 100) ) OR (Col2 <= 10)
    10. CompositeColumnValueFilter composite2 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.OR);
    11. SingleColumnValueFilter single3 = new SingleColumnValueFilter("Col2",
    12. SingleColumnValueFilter.CompareOperator.LESS_EQUAL, ColumnValue.fromLong(10));
    13. composite2.addFilter(composite1);
    14. 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

  上一篇:go 使用條件更新__最佳實踐_表格存儲-阿裏雲
  下一篇:go 寬行讀取__最佳實踐_表格存儲-阿裏雲