9.21 hbase查询API
HBase是一个分布式的、面向列的开源数据库,不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
项目中用到了hbase数据库,因为查询方式和以前用过的数据库很不同所以,想将摸索过程记录下来以便之后查看。
hbase查询最大的不同在于它使用了rowkey,通过扫描rowkey可以最快速的对数据进行查询,所以在建表初期rowkey的设计工作就尤为重要,因为会影响之后查找的使用工作。hbase的扫描查找分为get\scan两种,get为获取单行数据,而scan为获取多行数据,此处主要讲解scan查询。而查询方式也分为两种,一种就是针对rowkey的查询,一种就是针对列簇family和字段qualifier的使用过滤器查询。
在项目中使用的基本流程为先创建config(hbase数据库基本配置信息)
Configuration conf = HBaseConfiguration.create();
在set好配置信息之后创建hbase表对象
HTable ht = new HTable(conf, "tableName");
创建好之后就开始构造scan扫描器了,scan不进行具体配置的话为全表扫描,使用ResultScanner对象接收查询结果。
Scan scan = new Scan();
ResultScanner rs = ht.getScanner(scan);
Scan类的属性配置简要的罗列几条如下:
caching 影响一次读取返回的Results数量;
Batch 限定了一个Result中所包含的列的数量,如果一行数据被请求的列的数量超出Batch限制,那么这行数据会被拆成多个Results。;
storeLimit Scan操作所获取的行的数量 ;
storeOffset Scan操作所获取的哪页的数据 ;
CacheBlocks: RegionServer侧是否要缓存本次Scan所涉及的HFileBlocks ;
Raw 是否可以读取到删除标识以及被删除但尚未被清理的数据 ;
MaxResultSize: 从内存占用量的维度限制一次Scan的返回结果集 ;
Reversed 反向扫描 ;
allowPartialResults 允许返回部分结果 ;
loadColumnFamiliesOnDemand 按需载入列族;
接下来将详细介绍不同的查询类型:
1、首先是rowkey查询,这种查询方式是最常用的,使用rowkey的scan构造器
Scan scan = new Scan(startrow,stoprow);
注意,使用rowkey扫描时,结果集为[startrow,stoprow)的形式,如果想不包含startrow或者包含stoprow可以再尾部加上0;
如果存在不确定rowkey的值的情况:例如,某个表的rowkey形式为【shop_月份_门店iD】,如果是想取出该门店所有月份数据,设id=1 * 可
将startRow定为shop_*_1,将stopRow定为shop_~_1。
2、之后就是过滤器查询,当rowkey的满足不了查询需求时可以考虑使用过滤器查询,基本流程就是创建FilterList(过滤器组),再创建SingleColumnValueFilter设计详细的过滤信息放入过滤组中,即可查询。
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
构造器中的参数FilterList.Operator,是为了配置多过滤器且或关系的,
FilterList.Operator.MUST_PASS_ALL为需要过滤器都符合
FilterList.Operator.MUST_PASS_ONE为一个过滤器符合即可
之后开始构建单体过滤器SingleColumnValueFilter,最常使用的构造器为
SingleColumnValueFilter(byte[] family, byte[] qualifier, CompareOp compareOp, byte[] value)
family为列族,qualifier为字段名,value未查询的值,而compareOP为比较运算符 CompareFilter.CompareOp,枚举值如下:
LESS 小于
LESS_OR_EQUAL 小于等于
EQUAL 相等
NOT_EQUAL 不等于
GREATER_OR_EQUAL 大于等于
GREATER 大于
NO_OP 不包含
除了最基本的使用方法外还可以使用比较器,构造器与上述相似,就是将value值变为比较器即可,比较器的类型大致分为:
BinaryComparator 匹配完整字节数组
BinaryPrefixComparator 匹配字节数组前缀
BitComparator 不常用
NullComparator 不常用
RegexStringComparator 匹配正则表达式
SubstringComparator 匹配子字符串
scan查询还有很多细节,需要在开发过程中慢慢掌握。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类