一.简介
Scan扫描,类似于数据库系统中的游标,底层依赖顺序存储的数据结构。扫描操作的作用跟get()方式非常类似,但由于扫描操作的工作方式类似于迭代器,所以用户无需调用scan()方法创建实例,只需调用HTable的getScanner()方法【或者使用new Scan()】,此方法在返回真正的扫描器scanner实例的同时,用户也可以使用它的迭代来获取数据。如下:
ResultScanner getScanner(Scan scan) throws IOException
ResultScanner getScanner(byte[] family) throws IOException
ResultScanner getScanner(byte[] family, byte[] qualifier) throws IOException
后两个为了方便用户,隐式地创建了一个Scan实例,逻辑中调用getScanner(Scan scan)方法。
Scan类拥有以下构造器:
Scan() // hbase2.x中统一使用setxxx加以配置
Scan(byte[] startRow) // hbase2.x中已失效
Scan(byte[] startRow, Filter filter) // hbase2.x中已失效
Scan(byte[] startRow, byte[] filter) // hbase2.x中已失效
这与Get类的不同点时显而易见的,用户可以选择性地提供startRow参数来定义扫描读取HBase表的起始行键,即行键不是必须指定的。同时可选stopRow参数来限定读取到何处停止【HBase1.x】。
备注:起始行包括在内,终止行不包括在内。用区间表示为[startRow, stopRow)。
扫描操作有一个特点,用户提供的参数不必精确匹配到某一行。扫描会匹配相等或大于给定起始行键的数据。如果没有显式地指定起始行,它会从表的起始位置开始获取数据。终止行与之类似,但不会获取相同行。
另一个可选参数叫做过滤器filter,可直接指向Filter实例。尽管Scan实例通常由空白构造器构造,但其所有可选参数都有对应的getter和setter方法。
创建Scan实例后,用户可能还要给它增加更多的限制条件。这种情况下,用户仍然可以使用空白参数扫描,读取整个表,包括所有列族和其所属的所有类。可以使用多种方法限制所要读取的数据:
Scan addFamily(byte[] family)
Scan addColumn(byte[] family, byte[] qualifier)
可以使用addFamily()方法限制返回数据的列族,或者使用addColumn()方法限制返回的列。
备注:如果用户只需要数据的子集,那么限制扫描的范围就能发挥HBase的优势。因为HBase中的数据是按列族存储的,如果扫描不读取某个列族,那么整个列族文件就不会被读取,这就是列式存储架构的优势!
Scan setTimeRange(long minStamp, long maxStamp) throws IOException
Scan setTimestamp(long timestamp)
Scan setTimeStamp(long timestamp) // hbase2.x中已失效,注意大小写
Scan setMaxVersions() // hbase2.x中已失效
Scan setMaxVersions(int maxVersions) // hbase2.x中已失效
用户可以通过setTimestamp()设置详细的时间戳,或者通过setTimeRange()设置时间范围进一步对结果进行限制。。还可以使用setMaxVersions()方法,让扫描只返回每一列的一些特定版本,或者全部的版本。
Scan setStartRow(byte[] startRow) // hbase2.x中已失效
Scan setStopRow(byte[] stopRow) // hbase2.x中已失效
Scan setFilter(Filter filter)
boolean hasFilter()
还可以使用setStartRow()、setStopRow()以及setFilter()来进一步限定返回的数据。这3个方法中的参数可以与构造器中的一样。附加的hasFilter()方法可以检查是否已经设定过滤器。
其它方法如下:
