Hbase Filter+Scan 查询效率问题
1.Scan
HBase常用的查看数据方式有scan和get,get是一种特殊的scan,get是scan的startrow和endrow等于同一个值的特殊情况。
hbase的rowkey是按照B+树的形式存放的,所以查找一个具体的rowkey速度是非常快的,所以查询数据的时候一般都会设置scan的startrow和endrow,这样可以缩小查找的范围,所以rowkey的设计在hbase里面是极为重要的。
可以这样讲,hbase里面的查询数据只有scan一种形式,就是在B+树里面查找rowkey,而scan就是对rowkey的一种顺序”扫”。
查看一下scan里面对rowkey的条件筛选&#xff0c;只有startrow和endrow这一组&#xff0c;所以可以理解为sql条件里面的”>”和”<”。
hbase的rowkey是按照顺序排列的&#xff0c;所以在设计rowkey的时候尽量将业务查询需要的字段设计到rowkey里面&#xff0c;这样在查询的时候对rowkey加上一定范围的限制。
2.Filter
除了对rowkey的scan外&#xff0c;HBase为筛选数据提供了一组过滤器&#xff0c;通过这个过滤器可以在HBase中的数据的多个维度&#xff08;行&#xff0c;列&#xff0c;数据版本&#xff09;上进行对数据的筛选操作&#xff0c;也就是说过滤器最终能够筛选的数据能够细化到具体的一个存储单元格上&#xff08;由行键&#xff0c;列明&#xff0c;时间戳定位&#xff09;。
filter并不能做到像rowkey那样快速定位到数据&#xff0c;他的作用仅仅是过滤&#xff0c;在scan的过程中对列族的某个字段进行一定条件的判断。
通常来讲&#xff0c;scan来定位查找的大概范围&#xff0c;fitler来过滤找到具体的值。
下面看看hbase里面都提供了哪些filter
参考&#xff1a;
https://vergil.blog.csdn.net/article/details/79232926?utm_medium&#61;distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id&#61;1328602.69596.16152730172366075&depth_1-utm_source&#61;distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
众所周知&#xff0c;Hbase利用filter过滤器查询时候会进行全表扫描&#xff0c;查询效率低下&#xff0c;如果没有二级索引&#xff0c;在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案&#xff0c;仅供参考&#xff0c;欢迎交流。
根据业务要求&#xff0c;作者需要根据时间范围搜索所需要的数据&#xff0c;所以作者设计的rowKey是以时间戳为起始字符串的。
正确尝试&#xff1a;
1.scan 设置 开始行和结束行
Scan scan &#61; new Scan();scan.setStartRow("startRowKey".getBytes());scan.setStopRow("stopRowKey".getBytes());
结论&#xff1a;查询效率明显提升
2.查询的数量越小越好
总数据量越大&#xff0c;查询越耗时&#xff0c;所以为保证效率&#xff0c;开始行和结束行之间需要遍历的数据总量越少越好。
需要说明的是&#xff0c;在filter 中RowFilter设置开始行&#xff08;前缀&#xff09;和结束行&#xff08;前缀&#xff09;
并不能提升查询效率&#xff0c;因为还是全表扫描。
FilterList filters &#61; new FilterList(FilterList.Operator.MUST_PASS_ALL);//开头大于等于starTm的行Filter starTime &#61; new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new BinaryPrefixComparator(DateUtil.formatDate(starTime, "yyyyMMddHHmmssSSS").getBytes()));filters.addFilter(starTime);//开头小于等于endTime的行Filter endTime &#61; new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,new BinaryPrefixComparator(DateUtil.formatDate(endTime, "yyyyMMddHHmmssSSS").getBytes()));filters.addFilter(endTime);
结论&#xff1a;利用san&#43;filter方式查询hbase时&#xff0c;一定要设置starRow 和stopRow
参考&#xff1a;https://blog.csdn.net/u013465194/article/details/83044910