引言:过滤器的类型很多,但是可以分为两大类——比较过滤器,专用过滤器
过滤器的作用是在服务端判断数据是否满足条件,然后只将满足条件的数据返回给客户端;
在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();
}