更新时间:2022-07-19 GMT+08:00
分享

附录

Scan时的两个关键参数—Batch和Caching

Batch:使用scan调用next接口每次最大返回的记录数,与一次读取的列数有关。

Caching:一个RPC查询请求最大的返回的next数目,与一次RPC获取的行数有关。

首先举几个例子,来介绍这两个参数在Scan时所起到的作用:

假设表A的一个Region中存在2行(rowkey)数据,每行有1000column,且每列当前只有一个version,即每行就会有1000个key value。

  • 例1: 查询参数: 不设batch,设定caching=2

    那么,一次RPC请求,就会返回2000个KeyValue。

  • 例2: 查询参数: 设定batch=500,设定caching=2

    那么,一次RPC请求,只能返回1000个KeyValue。

  • 例3: 查询参数: 设定batch=300,设定caching=4

    那么,一次RPC请求,也只能返回1000个KeyValue。

关于Batch和Caching的进一步解释:

  • 一次Caching,是一次请求数据的机会。
  • 同一行数据是否可以通过一次Caching读完,取决于Batch的设置,如果Batch的值小于一行的总列数,那么,这一行至少需要2次Caching才可以读完(后面的一次Caching的机会,会继续前面读取到的位置继续读取)。
  • 一次Caching读取,不能跨行。如果某一行已经读完,并且Batch的值还没有达到设定的大小,也不会继续读下一行了。

    那么,关于例1与例2的结果,就很好解释了:

  • 例1的解释:

    不设定Batch的时候,默认会读完该行所有的列。那么,在caching为2的时候,一次RPC请求就会返回2000个KeyValue。

  • 例2的解释:

    设定Batch为500,caching为2的情况下,也就是说,每一次Caching,最多读取500列数据。那么,第一次Caching,读取到500列,剩余的500列,会在第2次Caching中读取到。因此,两次Caching会返回1000个KeyValue。

  • 例3的解释:

    设定Batch为300,caching为4的情况下,读取完1000条数据,正好需要4次caching。因此,只能返回1000条数据。

代码示例:

Scan s = new Scan();
//设置查询的起始key和结束key
s.setStartRow(Bytes.toBytes("01001686138100001"));
s.setStopRow(Bytes.toBytes("01001686138100002"));
s.setBatch(1000);
s.setCaching(100);
ResultScanner scanner = null;
try {
scanner = tb.getScanner(s);
for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {
for (KeyValue kv : rr.raw()) {
//显示查询的结果
System.out.println("key:" + Bytes.toString(kv.getRow())
+ "getQualifier:" + Bytes.toString(kv.getQualifier())
+ "value" + Bytes.toString(kv.getValue()));
}
}
} catch (IOException e) {
System.out.println("error!" + e.toString());
} finally {
scanner.close();
}
分享:

    相关文档

    相关产品