附录
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的解释:
不设定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(); }