引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器
过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;
在hbase shell中查询数据,可以在hbase shell中直接使用过滤器:
#hbase shell
scan ‘testByCrq’, FILTER=>“ValueFilter(=,‘substring:111’)”
如上命令所示,查询的是表名为testByCrq,过滤方式是通过value过滤,匹配出value含111的数据。
因在hbase shell中一些操作比较麻烦(比如删除字符需先按住ctrl在点击退格键),且退出后,查询的历史纪录不可考,故如下方式是比较方便的一种:
#echo “scan ‘testByCrq’, FILTER=>“ValueFilter(=,‘substring:111’)”” | hbase shell
如上命令,可在bash中直接使用,表名是testByCrq,过滤方式是通过value过滤,匹配出value含111的数据,中间的"需要用\转义。
以下介绍在hbase shell中常用的过滤器:
scan ‘testByCrq’, FILTER=>“RowFilter(=,‘substring:111’)”
如上命令所示,查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey含111的数据。
scan ‘testByCrq’, FILTER=>“RowFilter(=,‘binary:0111486816556’)”
如上命令所示,查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey等于0111486816556的数据。
scan ‘testByCrq’, FILTER=>“RowFilter(<=,‘binary:0111486816556’)”
如上命令所示,查询的是表名为testByCrq,过滤方式是通过rowkey过滤,匹配出rowkey小于等于0111486816556的数据。
scan ‘testByCrq’, FILTER=>“ValueFilter(=,‘substring:111’)”
如上命令所示,查询的是表名为testByCrq,过滤方式是通过value过滤,匹配出value含111的数据。
scan ‘testByCrq’, FILTER=>“FamilyFilter(=,‘substring:f’)”
如上命令所示,查询的是表名为testByCrq,过滤方式是通过列簇过滤,匹配出列簇含f的数据。
注:substring不能使用小于等于等符号。
scan ‘testByCrq’, FILTER=>“PrefixFilter(‘00000’)”
如上命令所示,查询的是表名为testByCrq,过滤方式是通过前缀过滤过滤的是行键,匹配出前缀为00000的数据
\
hbase过滤器的比较运算符:(按照字典顺序进行比较)
LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
NO_OP 排除所有(不做任何操作 等待)
Hbase过滤器的比较器(指定比较机制)
BinaryComparator 按字节索引顺序比较指定字节数组,采用Bytes.compareTo(byte[])
BinaryPrefixComparator 跟前面相同,只是比较左端的数据是否相同
NullComparator 判断给定的是否为空
BitComparator 按位比较
RegexStringComparator 提供一个正则的比较器,仅支持 EQUAL 和非EQUAL
SubstringComparator 判断提供的子串是否出现在value中。
Hbase的过滤器分类
比较过滤器
-
行键过滤器RowFilter
Filter filter1 = new RowFilter(CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("row-22"))); scan.setFilter(filter1);
-
列族过滤器FamilyFilter
Filter filter1 = new FamilyFilter(CompareFilter.CompareOp.LESS, new BinaryComparator(Bytes.toBytes("colfam3"))); scan.setFilter(filter1);
-
列过滤器QualifierFilter
filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("col-2"))); scan.setFilter(filter1);
-
值过滤器 ValueFilter
Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator(".4") ); scan.setFilter(filter1);
专用过滤器
-
单列值过滤器 SingleColumnValueFilter ----会返回满足条件的整行
SingleColumnValueFilter filter = new SingleColumnValueFilter( Bytes.toBytes("colfam1"), Bytes.toBytes("col-5"), CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("val-5")); filter.setFilterIfMissing(true); //如果不设置为true,则那些不包含指定column的行也会返回 scan.setFilter(filter1);
-
SingleColumnValueExcludeFilter
与上相反
-
前缀过滤器 PrefixFilter----针对行键
Filter filter = new PrefixFilter(Bytes.toBytes("row1")); scan.setFilter(filter1);
-
列前缀过滤器 ColumnPrefixFilter
Filter filter = new ColumnPrefixFilter(Bytes.toBytes("qual2")); scan.setFilter(filter1);
-
分页过滤器 PageFilter
/** * 分页查询 * * @throws Exception */ @Test public void pageScan() throws Exception { //定义一个字节数组(0x00 这是我们给的一个随机数) final byte[] POSTFIX = new byte[]{0x00}; //定义一个table对象 Table table = conn.getTable(TableName.valueOf("t_user_info")); //一次需要获取一页的条数 Filter filter = new PageFilter(3); //定义个字节数组 byte[] lastRow = null; //总数 初始值0 int totalRows = 0; while (true) { Scan scan = new Scan(); //权标扫描,每次返回三条 scan.setFilter(filter); if (lastRow != null) { byte[] startRow = Bytes.add(lastRow, POSTFIX); //设置本次查询的起始行键 00000030x00 scan.setStartRow(startRow); } ResultScanner scanner = table.getScanner(scan); int localRows = 0; //开始行号 Result result; //如果不等null 说明里面有值 while ((result = scanner.next()) != null) { System.out.println(++localRows + ":" + result); totalRows++; //结果赋值 lastRow = result.getRow(); //0000003 } scanner.close(); //重新赋值0,在进行下一次的查询 if (localRows == 0) { break; } Thread.sleep(2000); } System.out.println("total rows:" + totalRows); //关闭 table.close(); conn.close(); }