一、Scan 缓存机制: 3.5.3
通过Scan扫描,每一次调用next()方法都会生成一个单独的PRC请求,并且返回一条记录。
缓存可以让next()一次获取多条记录。
设置缓存方式有两种 :
1)表Htable层面 setScannerCaching(int)
2)Scan类 setCaching(int) 3)通过设置配置文件hbase-site.xml
<property>
<name>hbase.client.scanner.caching</name>
<value>10</value>
</property>
优先级顺序为: scan类 -->Htable类-->配置文件
缓存是面向行一级的操作,而批量则是面向列一级的操作
二、设置bacth批量查询:
批量可以让用户选择每一次ResultScanner实例的next()操作要取回多少列
例如,setBatch(5),则一次next()返回的Resulut实例包括5列
三、测试设置缓存和批量查询的时间:
不设置缓存查询时间: 9978
设置缓存查询时间: 9890
public static void findAll(String tablename){
try {
Table table = conn.getTable(TableName.valueOf(tablename));
//EQUAL 匹配等于设定值的值
Scan scan = new Scan();
//设置扫描批次,一次next()返回 Result实例会包括5列
//scan.setBatch(5);
//hbase设置缓存
//scan.setCaching(100);
long starttime = System.currentTimeMillis();
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> its = scanner.iterator();
while (its.hasNext()) {
printOut(its.next());
}
scanner.close();
System.out.println(System.currentTimeMillis()-starttime);
System.out.println("---查询成功!---");
} catch (IOException e) {
e.printStackTrace();
System.out.println("---查询失败!---");
}
}
Filter过滤器:
HBase中两种主要的数据读取函数 是get和scan,但是他们缺少一些细粒度的筛选功能,
不能对行键、列名或列值进行过滤,但是通过滤过器可以达到这个目的。
get ()和scan () ,它们都支持直接访问数据和通过指定起止行键访问数据的功能。
可以在查询中添加更多的限制条件来减少查询得到的数据量,这些限制可以是指定列族、列、时间戳以及版本号
谓词下推:所有的过滤器都在服务器端生效,这样可以保证被过滤掉的数据不会被传送到客户端.
定义Filter时,需要考虑三个对象:
比较运算符:CompareFilter
定义对应的比较器:
定义对应的过滤器:RowFilter、familyFilter、valueFilter、QualiterFilter等
1)查询testA表中值为aaa的数据
hbase(main):023:0> scan 'testA',{FILTER => "ValueFilter(=, 'binary:aaa')"}
ROW COLUMN+CELL
row-1 column=FA1:a, timestamp=1558225046619, value=aaa
row-1 column=FB2:a, timestamp=1558225625470, value=aaa
public static void findAll(String tablename){
try {
Table table = conn.getTable(TableName.valueOf(tablename));
//EQUAL 匹配等于设定值的值
Filter filter = new ValueFilter(CompareOp.EQUAL,new SubstringComparator("aaa"));
//Filter filter = new ValueFilter(CompareOp.EQUAL,