摘要

最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowKey中显然不太可能),或者全表扫描再结合过滤器筛选出目标数据(太低效),所以通过设计HBase的二级索引来解决这个问题

查询需求

多个查询条件构成多维度的组合查询,需要根据不同组合查询出符合查询条件的数据

HBase的局限性

HBase本身只提供基于行键和全表扫描的查询,而行键索引单一,对于多维度的查询困难(如:对于价格+天数+酒店+交通的多条件组合查询困难),全表扫描效率低下。

二级索引的设计

设计思路

                               (图1)设计思路

二级索引的本质就是建立各列值与行键之间的映射关系

如(图1),当要对F:C1这列建立索引时,只需要建立F:C1各列值到其对应行键的映射关系,如C11->RK1等,这样就完成了对F:C1列值的二级索引的构建,当要查询符合F:C1=C11对应的F:C2的列值时(即根据C1=C11来查询C2的值,图1青色部分)

其查询步骤如下:

1. 根据C1=C11到索引数据中查找其对应的RK,查询得到其对应的RK=RK1

2. 得到RK1后就自然能根据RK1来查询C2的值了 这是构建二级索引大概思路,其他组合查询的联合索引的建立也类似。

逻辑视图

(图2) 部分数据在HBase中存储的逻辑视图

表中有两个列族,其中一个是列族INDEX,其并不存储任何的数据,仅仅是为了将索引数据与主数据分开存储(因为在HBase中同一列族的数据会被压缩在一起存储),索引数据的行键格式为:RegionStartKey-索引名-索引键-Rowkwy,其他RegionStartKey就是出发点,因为在创建HBase表时就对表根据出发点进行了预分区,索引键为主数据中某列(可能是多列)的列值,Rowkey对应主数据的行键;主数据的行键格式为:出发点-目的地-性价比,所以在存储数据时,同一出发点 目的地的数据默认是按性价比排序的;索引数据的行键和主数据的行键的前缀都是出发点,所以在存储时相同出发点的索引数据和主数据是存储在同一个Region中的,这样避免了在通过索引得到RK后又去其他Region上查询目标数据,提高了查询效率。

数据的查询过程

假设查询的条件:

  • 出发点:澳门

  • 目的地:杭州

  • 出游天数:3天

  • 酒店等级:4

其查询步骤如下:

  1. 首先根据查询条件来确定索引名,根据其查询条件为出游天数据 酒店等级确定索引名为aaa,这样就将查询的范围缩小在索引名为aaa的索引数据区内

  2. 根据出游天数的值为3天,酒店等级的值为4,结合Phoenix的模糊查询就能确定符合这两个查询条件的索引数据的行键

  3. 得到索引数据行键后就截取其最后的RowKey

  4. 最关键的Rowkey得到后就能轻易的获得其对应的列值了,整个查询过程就结束了。

对于其他更为复杂的组合查询的二级索引设计如类似。

缺点

需要额外的存储空间,属 一种以空间换时间的方式。

注意

1.将查询条件中的可选字段转换成数字能节省存储空间,如交通工具中的飞机,高铁,火车,轮船,汽车分别转换成5,4,3,2,1

2.将汉字转换成拼音才能保证数据按HBase的排序规则排序

3.如果数据量在百万级别以下可使用Phoenix(HBase的SQL查询引擎)模糊查询功能减少索引行键的设计

参考资料

HBase高性能复杂条件查询引擎

奇虎360 HBASE二级索引的设计与实践

HBase二级索引的设计相关推荐

  1. HBase二级索引的设计与应用(详解)

    最近面试,涉及到了HBase的多条件组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowKe ...

  2. 基于ES的HBase二级索引方案

    HBase不支持多条件查询,不提供二级索引,难以满足用户对检索功能多样性和高效率两方面的需求.由索引模块的需求分析可知,本文解决通过,提出数据与索引的分离,利用HBase数据库的存储模式灵活多变,容纳 ...

  3. 使用solr构建hbase二级索引

    使用solr构建hbase二级索引 @(HBASE)[hbase, solr] 使用solr构建hbase二级索引 一概述 一业务场景描述 二技术方案 1技术方案一 2技术方案二 3关于索引的建议 二 ...

  4. hbase组合rowkey_「从零单排HBase 11」HBase二级索引解决方案

    HBase一个令人惋惜的地方,就是不支持二级索引.因此,社区有了很多补充方案来填补HBase的二级索引能力的缺陷. 今天,我们就来看看有哪些二级索引方案,通过对比各个方案的优缺点,并结合我们的具体场景 ...

  5. CDH 6 安装 Hbase 二级索引 Solr + Key-Value Store Indexer

    目录 一.集群安装Solr +  Key-Value Store Indexer 二.创建Hbase二级索引 1.更改表结构,允许复制 2.创建相应的SolrCloud集合 3.创建 collecti ...

  6. 基于Solr的Hbase二级索引

    关于Hbase二级索引 HBase 是一个列存数据库,每行数据只有一个主键RowKey,无法依据指定列的数据进行检索.查询时需要通过RowKey进行检索,然后查看指定列的数据是什么,效率低下.在实际应 ...

  7. 华为HBase 二级索引调研

    1.Overall Solution 解决思想: 一个user table对应一个index table index的创建与更新全部在RS端的cp-processor里实现 核心思想:一个actual ...

  8. (转)HBase二级索引与Join

    二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性.RDBMS支持得比较好,NOSQL阵营也在摸索着符合自身特点的最佳解决方案. 这篇文章会以HBase做为对象来探讨如何基于Hba ...

  9. 阿里云EMR异步构建云HBase二级索引

    一.非HA EMR构建二级索引 云HBase借助Phoenix实现二级索引功能,对于Phoenix二级索引的详细介绍可参考https://yq.aliyun.com/articles/536850?s ...

  10. Hbase 二级索引 Solr int字段排序问题 can not sort on multivalued field

    Hbase Solr 同步二级索引后,进行int字段排序时报错 报错如下 {"responseHeader":{"zkConnected":true," ...

最新文章

  1. 从SQL Server 2000/2005到SQL Server 2008的升级测试
  2. MySQL 深入浅出索引(上)
  3. GPTEE中定义的RSA的Algorithm Identifier详解
  4. boost::has_range_iterator相关的测试程序
  5. Git根据commitId查看提交内容:根据commitId查看某次提交的内容
  6. 异常检测之浅谈入侵检测
  7. java密码学原型算法_java密码学原型算法实现——双线性对.pdf
  8. 固执己见的框架(例如Spring Boot)的危险。 求知代码反转
  9. android 静默安装实现,Android 中静默安装实现详解
  10. [渝粤教育] 中国地质大学 工业卫生技术 复习题
  11. Android之录制歌曲
  12. matlab 质心,Matlab中三点确定质心
  13. 从0到1,搭建经营分析体系
  14. Bluetooth core 5.0 ---------- BR/EDR 安全简单配对(BR/EDR secure simple pairing)
  15. 鼠标点击网页出现爱心特效
  16. 计算机常用英语(键盘符号),计算机常用英语..docx
  17. 《通过PMBOK看项目管理软件》交流活动
  18. python读取股票数据_python2自动读取股票数据示例
  19. 辛巴学院-Unity-剑英陪你零基础学c#系列(一)Hello World
  20. 表必备三字段:id, gmt_create, gmt_modified

热门文章

  1. HTMLCSS字体之引入外部字体
  2. WPS国际版添加中文包
  3. MindManager 2020注册机下载
  4. Android如何计算时间差
  5. c语言utc时间转换,gps时转换为utc时间方法
  6. ass字幕转换成文本文件
  7. Qt For Android 获取手机屏幕大小
  8. C/C++多线程面试题
  9. 无人机,动力系统建模
  10. 一线互联网公司的前端开发流程