基于H Base 模糊 查询的RowKey 设计
目录
一、 概述
HB ase 作为 一种 kv数据库 ,能够很好的面对高吞吐率 的 在线数据 读写 服务, 但 是 在 非 RowKey字段 的 条件查询 上, 性能 表现就 不是 太理想,本文 探讨 一 种 通过 对Row Key 的设计,提升非R owKey 字段 模糊查询 性能 的 设计 方法 。
二、业务场景
医院一般检验 流程 :检验 申请 单( bill )→检验 报告 (report ) ,现在 要求能够通过申请单号以及 检验 指标对检验报告进行快速 模糊 查询。其中申请单号 ( OrderNo ) 以及检验指标代码 ( TestCode ) 是检验报告的两个字段。
三 、 R owKey 设计
如果 直接对检验报告 的 两个字段进行 模糊 匹配查询 ,HB ase 需要 扫描整个数据集,逐条进行 筛选 ,性能表现可想而知。
为了 提升查询性能,我们要想办法把这两个字段组合到表的 RowK ey 里, 初步想法:
RowKey |
f1 |
||
OrderNo |
TestCode |
… |
|
0001_2003_ * |
1 |
2003 |
|
0002_1025_ * |
2 |
1025 |
|
R owKey 由 申请单号和检验指标 代码组合 而成,当然这两个字段外 还会 有其它拼接值,比如时间戳、序号等,这些就不再展开说。 申请 单号作为 Row Key 的 前缀,如果有基于申请单号的查询,可以直接走 HBase的 前缀查询,性能会非常高, 第二 字段 是 检验指标代码 , 如果有 基于 检验指标代码的查询 , 可以走 HBase的 模糊查询,两个字段的组合情况,就不一一说了,因为最终它都 能 落地到以上两种方式的查询。
四 、过滤器选择
前缀 查询 用 PrefixFilter , 很简单,直接上代码:
模糊 查询用 FuzzyRowFilter , 相对 复杂 一点, 假如 ,我们要查询检验 指标 代码 是1025的 所有检验报告,代码如下:
FuzzyRowFilter 需要把 模糊字段值组织成 P air 对 , firt是定长 的 RowKey串 ,其中模糊匹配部分用 ?或 \\x00 占位 , second是first的 掩码,模糊匹配部分是 1, 固定部分是 0,first和second长度 相同。
五 、进一步说明
前提 条件:
1、 在 HBase 装入数据前 , 需要有 R owKey 的 设计规划。
2、 HBase RowKey 的每个 组合部分 都要 固定长度,不够长度的要有填充策略。
Attachments:
基于HBase模糊查询的RowKey设计.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)