HBase笔记--filter的使用
HBASE过滤器介绍:
所有的过滤器都在服务端生效,叫做谓语下推(predicate push down),这样可以保证被过滤掉的数据不会被传送到客户端。
注意:
基于字符串的比较器,如RegexStringComparator和SubstringComparator,比基于字节的比较器更慢,更消耗资源。因为每次比较时它们都需要将给定的值转化为String.截取字符串子串和正则式的处理也需要花费额外的时间。
过滤器本来的目的是为了筛掉无用的信息,所有基于CompareFilter的过滤处理过程是返回匹配的值。
各种自定义过滤器: http://www.cnblogs.com/chshnan/archive/2013/03/27/2984143.html
HBase利用Scan对表进行扫描
Scan scan = new Scan(); ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) {//ResultScanner实现了Iterator接口 //do something here }
可以使用如下方法对输出数据进行选择
// 返回指定列族下的指定qualifier中的值 public Scan addColumn(byte[] family, byte[] qualifier) // 设置扫描的起始行,starRow是存储时候用的rowKey public Scan setStartRow(byte[] startRow) // 设置扫描的结束行,stopRow是存储时候用的rowKey public Scan setStopRow(byte[] stopRow) // 设置返回结果的时间戳 public Scan setTimeStamp(long timestamp) //设置返回结果的时间戳返回 public Scan setTimeRange(long minStamp, long maxStamp) //设置过滤器,这是非常灵活的扫描机制 public Scan setFilter(Filter filter)
如何使用Filter
HBase提供了很多预装过滤器
1. RowFilter 行过滤器(基于行键过滤数据)
public RowFilter(CompareOp rowCompareOp, WritableByteArrayComparable rowComparator)
RowFilter是用来对rowkey进行过滤的,比较符如下:
Operator |
Description |
LESS |
小于 |
LESS_OR_EQUAL |
小于等于 |
EQUAL |
等于 |
NOT_EQUAL |
不等于 |
GREATER_OR_EQUAL |
大于等于 |
GREATER |
大于 |
NO_OP |
排除所有 |
Comparator |
Description |
BinaryComparator |
使用Bytes.compareTo()比较 |
BinaryPrefixComparator |
和BinaryComparator差不多,从前面开始比较 |
NullComparator |
Does not compare against an actual value but whether a given one is null, or not null. |
BitComparator |
Performs a bitwise comparison, providing a BitwiseOp class with AND, OR, and XOR operators. |
RegexStringComparator |
正则表达式 |
SubstringComparator |
把数据当成字符串,用contains()来判断 |
例:
相关的过滤方法使用:
提取rowkey以01结尾数据
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator(".*01$"));
提取rowkey以包含201407的数据
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("201407"));
提取rowkey以123开头的数据
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator("123".getBytes()));
2. 前缀过滤器(RowFilter的特例)
String prefix = "a";
Scan scan = new Scan(prefix.getBytes());
scan.setFilter(new PrefixFilter(prefix.getBytes()));
3. 限定符过滤器(类似于行过滤器RowFilter的比较过滤器,但它用来匹配列限定符而不是行键)
比较运算符和比较器类型与RowFilter一样
Filter filter = new QualifierFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes("colqual120")));
4.ValueFilter 值过滤器(提供与行过滤器或限定符相同功能,只是针对的是单元值)
值过滤器不指定某个列,它会将所有含有某个值的列取出来,混在一起
Filter filter = new ValueFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryPrefixComparator(Bytes.toBytes("foo"))); //过滤掉所有单元值不是foo开头的列
5. 时间戳过滤器
List<Long> timestamps = new ArrayList<Long>(); timestamps.add(100L); timestamps.add(200L); Filter filter = new TimeStampsFilter(timestamps);
6. SingleColumnValueFilter(影响查询性能,在处理大量数据的时候速度可能会慢)
过滤某列值大于多少小于多少:
List<Filter> filters = new ArrayList<Filter>(); filters.add( new SingleColumnValueFilter(Bytes.toBytes("pinfo"), //列族 Bytes.toBytes("t"), //列名 CompareOp.GREATER,Bytes.toBytes("1359901"]) ) //值 filters.add( new SingleColumnValueFilter(Bytes.toBytes("pinfo"), Bytes.toBytes("t"), CompareOp.LESS,Bytes.toBytes("1389901"]) ) FilterList filterList1 = new FilterList(Operator.MUST_PASS_ALL,filters); sn.setFilter(filterList1);
7. 过滤器列表