hbase过滤器2
2019獨角獸企業重金招聘Python工程師標準>>>
1. RowFilter:篩選出匹配的所有的行,對于這個過濾器的應用場景,是非常直觀的:使用BinaryComparator可以篩選出具有某個行鍵的行,或者通過改變比較運算符(下面的例子中是CompareFilter.CompareOp.EQUAL)來篩選出符合某一條件的多條數據,以下就是篩選出行鍵為row1的一行數據:
Filter?rf?=?new?RowFilter(CompareFilter.CompareOp.EQUAL,?new?BinaryComparator(Bytes.toBytes("row1")));? //?OK?篩選出匹配的所有的行2.?PrefixFilter:篩選出具有特定前綴的行鍵的數據。這個過濾器所實現的功能其實也可以由RowFilter結合RegexComparator來實現,不過這里提供了一種簡便的使用方法,以下過濾器就是篩選出行鍵以row為前綴的所有的行:
Filter?pf?=?new?PrefixFilter(Bytes.toBytes("row"));?//?OK??篩選匹配行鍵的前綴成功的行3.?KeyOnlyFilter:這個過濾器唯一的功能就是只返回每行的行鍵,值全部為空,這對于只關注于行鍵的應用場景來說非常合適,這樣忽略掉其值就可以減少傳遞到客戶端的數據量,能起到一定的優化作用:
Filter?kof?=?new?KeyOnlyFilter();?//?OK?返回所有的行,但值全是空4.?RandomRowFilter:從名字上就可以看出其大概的用法,本過濾器的作用就是按照一定的幾率(<=0會過濾掉所有的行,>=1會包含所有的行)來返回隨機的結果集,對于同樣的數據集,多次使用同一個RandomRowFilter會返回不通的結果集,對于需要隨機抽取一部分數據的應用場景,可以使用此過濾器:
Filter?rrf?=?new?RandomRowFilter((float)?0.8);?//?OK?隨機選出一部分的行5.?InclusiveStopFilter:掃描的時候,我們可以設置一個開始行鍵和一個終止行鍵,默認情況下,這個行鍵的返回是前閉后開區間,即包含起始行,單不包含中指行,如果我們想要同時包含起始行和終止行,那么我們可以使用此過濾器:
Filter?isf?=?new?InclusiveStopFilter(Bytes.toBytes("row1"));?//?OK?包含了掃描的上限在結果之內6.?FirstKeyOnlyFilter:如果你只想返回的結果集中只包含第一列的數據,那么這個過濾器能夠滿足你的要求。它在找到每行的第一列之后會停止掃描,從而使掃描的性能也得到了一定的提升:
Filter?fkof?=?new?FirstKeyOnlyFilter();?//?OK?篩選出第一個每個第一個單元格7.?ColumnPrefixFilter:顧名思義,它是按照列名的前綴來篩選單元格的,如果我們想要對返回的列的前綴加以限制的話,可以使用這個過濾器:
Filter?cpf?=?new?ColumnPrefixFilter(Bytes.toBytes("qual1"));?//?OK?篩選出前綴匹配的列8.?ValueFilter:按照具體的值來篩選單元格的過濾器,這會把一行中值不能滿足的單元格過濾掉,如下面的構造器,對于每一行的一個列,如果其對應的值不包含ROW2_QUAL1,那么這個列就不會返回給客戶端:
Filter?vf?=?new?ValueFilter(CompareFilter.CompareOp.EQUAL,?new?SubstringComparator("ROW2_QUAL1"));? //?OK?篩選某個(值的條件滿足的)特定的單元格9.?ColumnCountGetFilter:這個過濾器來返回每行最多返回多少列,并在遇到一行的列數超過我們所設置的限制值的時候,結束掃描操作:
Filter?ccf?=?new?ColumnCountGetFilter(2);?//?OK?如果突然發現一行中的列數超過設定的最大值時,整個掃描操作會停止10.?SingleColumnValueFilter:用一列的值決定這一行的數據是否被過濾。在它的具體對象上,可以調用setFilterIfMissing(true)或者setFilterIfMissing(false),默認的值是false,其作用是,對于咱們要使用作為條件的列,如果這一列本身就不存在,那么如果為true,這樣的行將會被過濾掉,如果為false,這樣的行會包含在結果集中。
SingleColumnValueFilter?scvf?=?new?SingleColumnValueFilter(??Bytes.toBytes("colfam1"),???Bytes.toBytes("qual2"),???CompareFilter.CompareOp.NOT_EQUAL,???new?SubstringComparator("BOGUS"));?? scvf.setFilterIfMissing(false);?? scvf.setLatestVersionOnly(true);?//?OK11.?SingleColumnValueExcludeFilter:這個與10種的過濾器唯一的區別就是,作為篩選條件的列的不會包含在返回的結果中。
12.?SkipFilter:這是一種附加過濾器,其與ValueFilter結合使用,如果發現一行中的某一列不符合條件,那么整行就會被過濾掉:
Filter?skf?=?new?SkipFilter(vf);?//?OK?發現某一行中的一列需要過濾時,整個行就會被過濾掉13.?WhileMatchFilter:這個過濾器的應用場景也很簡單,如果你想要在遇到某種條件數據之前的數據時,就可以使用這個過濾器;當遇到不符合設定條件的數據的時候,整個掃描也就結束了:
Filter?wmf?=?new?WhileMatchFilter(rf);?//?OK?類似于Python?itertools中的takewhile14.?FilterList:用于綜合使用多個過濾器。其有兩種關系:FilterList.Operator.MUST_PASS_ONE和FilterList.Operator.MUST_PASS_ALL,默認的是FilterList.Operator.MUST_PASS_ALL,顧名思義,它們分別是AND和OR的關系,并且FilterList可以嵌套使用FilterList,使我們能夠表達更多的需求:
List<Filter>?filters?=?new?ArrayList<Filter>();?? filters.add(rf);?? filters.add(vf);?? FilterList?fl?=?new?FilterList(FilterList.Operator.MUST_PASS_ALL,?filters);//?OK?綜合使用多個過濾器,?AND?和?OR?兩種關系?
?
轉載于:https://my.oschina.net/u/2000675/blog/645993
總結
- 上一篇: oc-21-class对象
- 下一篇: 转: C语言中位运算符异或“∧”的作用