hbase学习

HBase中RowKey可以唯一标识一行记录,在HBase中检索数据有以下三种方式:

  1. 通过 get 方式,指定 RowKey 获取唯一一条记录
  2. 通过 scan 方式,设置 startRow 和 stopRow 参数进行范围匹配
  3. 全表扫描,即直接扫描整张表中所有行记录

对于scan来说,哪些会全表扫描,哪些不会全表扫?

scan可以根据rowkey,cf,column,timestamp,filter来获取方式。在这里优先推荐根据rowkey的方式获取数据,即可以指定startrow和endrow,也可以指定具体的某个行键去获取数据。在源码中也指出了如果具体指定了rowkey,那么会只是扫描那一段的数据。众所周知,hbase底层存储数据是根据rowkey的字典顺序存储数据的,所以如果使用rowkey的方式去查找,scan就可以顺序查找,大大缩短了时间。

    Rather than specifying a single row, an optional startRow  and stopRow may be defined.
        If rows are not specified, the Scanner will iterate over all rows.

HBase过滤器Filter

HBase中的get、scan都支持过滤器,过滤器在服务端生效,这样可以保证被过滤掉的数据不会被传送到客户端,从而提高了代码运行的效率。
过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤, 分类:

1、RowFilter

说明:筛选出匹配的所有的行,支持基于行键过滤数据,可以执行精确匹配,子字符串匹配或正则表达式匹配,过滤掉不匹配的数据。

用法:使用BinaryComparator可以筛选出具有某个行键的行,或者通过改变比较运算符来筛选出符合某一条件的多条数据

示例:扫描所有“firstRow”行的数据。

Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("firstRow")));  
2、QualifierFilter

说明:该Filter是一种类似RowFilter的比较过滤器,不同之处是它用来匹配列限定符而不是行健

示例:扫描所有的列名为“name”的列数据。

Filter filter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator("name"));  

3、PrefixFilter

说明:这是RowFilter的一种特例,它基于行健的前缀值进行过滤,它相当于给扫描构造函数Scan(byte[] startRow, byte[] stopRow),提供了一个停止键,只是你不需要自己计算停止键。

示例:过滤所有“second”前缀的行的数据

Filter filter = new PrefixFilter(Bytes.toBytes("second"));  
4、KeyOnlyFilter

说明:这个Filter只会返回每行的行键+列簇+列,而不返回值,对不需要值的应用场景来说,非常实用,减少了值的传递。

示例:

Filter filter = new KeyOnlyFilter();

5、TimestampsFilter

说明:该过滤器允许针对返回给客户端的时间版本进行更细粒度的控制,使用的时候,可以提供一个返回的时间戳的列表,只有与时间戳匹配的单元才可以返回。当做多行扫描或者是单行检索时,如果需要一个时间区间,可以在Get或Scan对象上使用setTimeRange()方法来实现这一点。

示例:过滤时间戳列表中对应的列数据

List timestamps = new ArrayList();
timestamps.add(1479788961691L);
timestamps.add(1479788676517L);
timestamps.add(1479788812565L);
Filter filter = new TimestampsFilter(timestamps);

6、FirstKeyOnlyFilter

说明:该Filter的作用,是找每一行的第一列数据,找到之后,就会停止扫描。

示例:
Filter filter = new FirstKeyOnlyFilter();

7、ColumnPrefixFilter

说明:该Filter是按照列名的前缀来扫描单元格的,只会返回符合条件的列数据

Filter filter = new ColumnPrefixFilter(Bytes.toBytes("pay"));  

你可能感兴趣的:(hbase学习)