我有一个HBase表格,需要获取多个范围内的结果。例如,我可能需要从不同的范围(如行1-6、100-150)中获取数据。我知道每次扫描都可以定义起始行和停止行。但是如果我有6个范围,我需要进行6次扫描。是否有一种方法可以通过一次扫描或一个RPC从多个范围中获取结果?我的HBase版本是0.98。
我有一个HBase表格,需要获取多个范围内的结果。例如,我可能需要从不同的范围(如行1-6、100-150)中获取数据。我知道每次扫描都可以定义起始行和停止行。但是如果我有6个范围,我需要进行6次扫描。是否有一种方法可以通过一次扫描或一个RPC从多个范围中获取结果?我的HBase版本是0.98。
支持扫描多个行键范围的过滤器。它可以从传递的列表构造行键范围,每个区域服务器都可以访问该列表。
当仅扫描一个小的行键范围时,HBase非常高效。如果用户需要在一个扫描中指定多个行键范围,则典型的解决方案有:
它们都不能利用范围信息执行扫描期间的快速转发,这是非常耗时的。如果范围的数量相当大(例如数百万),连接是一个合适的解决方案,尽管它很慢。
然而,有些情况下用户只想指定少量的范围进行扫描(例如<1000个范围)。在这种情况下,这两种解决方案都无法提供令人满意的性能。
MultiRowRangeFilter支持这种用例(扫描多个行键范围),它可以从用户指定的列表构造行键范围,并在扫描期间执行快速转发。因此,扫描将非常高效。
package chengchen;
import java.util.ArrayList;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.MultiRowRangeFilter;
import org.apache.hadoop.hbase.filter.MultiRowRangeFilter.RowKeyRange;
import org.apache.hadoop.hbase.util.Bytes;
public class MultiRowRangeFilterTest {
public static void main(String[] args) throws Exception {
if (args.length < 1) {
throw new Exception("Table name not specified.");
}
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, args[0]);
TimeCounter executeTimer = new TimeCounter();
executeTimer.begin();
executeTimer.enter();
Scan scan = new Scan();
List<RowKeyRange> ranges = new ArrayList<RowKeyRange>();
ranges.add(new RowKeyRange(Bytes.toBytes("001"), Bytes.toBytes("002")));
ranges.add(new RowKeyRange(Bytes.toBytes("003"), Bytes.toBytes("004")));
ranges.add(new RowKeyRange(Bytes.toBytes("005"), Bytes.toBytes("006")));
Filter filter = new MultiRowRangeFilter(ranges);
scan.setFilter(filter);
int count = 0;
ResultScanner scanner = table.getScanner(scan);
Result r = scanner.next();
while (r != null) {
count++;
r = scanner.next();
}
System.out
.println("++ Scanning finished with count : " + count + " ++");
scanner.close();
}
}