使用java操作hbase的scan操作代码级别的中调用有这么一个api:
ResultScanner result = table.getScanner(scan); 这个 ResultScanner是迭代器,迭代器中每一个元素是一个result类,看一下result类的实现,发现他有一个方法publicKeyValue[] raw(),这个方法返回一个keyValue类的数组,ok继续看这个keyValue类的实现keyValue继承了cell这个接口,cell又是什么那,来看一下源码中的英文注释,有兴趣的亲子去翻译一下,大概的意思是:他是hbase基本存储单元,由以下几个属性组成:
1) row
2) column family
3) column qualifier
4) timestamp
5) type
6) MVCC version
7) value
这几个字段的是啥意思就不再解释了,可以参考别的资料去学习,这里主要就是得到row,value这就是对应row的对应值,这里发现只能去到column family获取不到column,不知道是不是我没看明白代码。综上看出来其实scan操作返回的就是一个迭代器,迭代器中存放的是一个result类,这个类Cell的数组,通过数组中的每一个cell可以得到数据
到这里我们就要说一下,hbase是怎么确定一次从客户端拿到多少数据的那,也就是说一次拿几行的数据,这些行中又有多少column的数据那?
这是用cache,batch来计算的,这两个值在hbase的配置文件中都能够配置,简明地说cache是hbase客户端做的一个缓存,batch是server端的一个缓存;scan操作做操作的时候,hbase客户端是通过rpc去hbase server端取数据的,一次rpc中能够获取的行数就是cache的值,server 端一次能够传送的column的数量就是batch,据一个例子吧:假设cache =2 ,batch = 10,要查询的数据在server端一共有10行数据,20个column,也就是由200cell需要取得,那么我们一次rpc能够处理两行的数据,每次能够获取10个column,也就是能够去到20个cell,一共200个cell,就需要10次rpc取完毕,最后再有一次rpc确认scan结束。