Hbase中表结构的设计

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: Hbase中表结构的设计

文章目录

1.Hbase表设计

前言

关系型数据库中,表与表之间的关系有多种,一对一,一对多以及多对多的关系,那在hbase中这种关系怎么设计呢?

  1. 一对一:一个订单对应一笔支付。
  2. 一对多:一笔订单对应多个多个商品。
  3. 多对多:一个用户对应多个角色,一个角色对应多个用户。关系型数据库中一般实现一对一,两个表之间之间关联,一对多一个主表和一个字表,多对多一般建立一个表来存两个表之间的关系。

1.Hbase表设计

1.1 RowKey的设计

Hbase中的row key是按照字母顺序排序的。这种设计方便Scan查询数据,进行相关行的读取与存储。 HBase中row key用来检索表中的记录,支持以下三种方式

  1. 通过单个row key访问:即按照某个row key键值进行get操作;
  2. 通过row key的range进行scan:即通过设置startRowKey和endRowKey,在这个范围内进行扫描;
  3. 全表扫描:即直接扫描整张表中所有行记录。

官方文档提供了三种设计方法


加盐

hash

反转

1.2 列族

不要在一张表里定义太多的column family。目前Hbase并不能很好的处理超过2~3个column family的表。因为某个column family在flush的时候,它邻近的column family也会因关联效应被触发flush,最终导致系统产生更多的I/O。

1.3 时间差反转 Reverse Timestamps

在实际中经常需要找到最近的版本的值,使用时间戳反转技术(Long.MAX_VALUE - timestamp)能够很好的解决这个问题。[key][reverse_timestamp].

其他的设计根据需要在官网进行查阅。

2.表设计案例

需求:CSDN发博客表,关注列表和粉丝列表。

2.1 关注列表和粉丝列表

关注列表和粉丝列表是一个多对多的关系,博主可以有多个粉丝,也可以关注多个人。

博主 关注列表 粉丝列表

Blogger1 Blogger3 Blogger2,Blogger3

Blogger2 Blogger3,Blogger4 Blogger1

Blogger3 Blogger1 Blogger2,Blogger4

Blogger4 Blogger5 Blogger1,Blogger2,Blogger3

表设计

csdn为每一位博主分配一个ID

Rowkey cf1:关注列表 cf2:粉丝列表

CSDN_1 cf:CSDN_3=bob cf:CSDN_2=elite,cf:CSDN_3=bob

CSDN_2 cf:CSDN_3=bob cf:CSDN_2=elite,cf:CSDN_3=bob

CSDN_3 cf:CSDN_1=jakson cf:CSDN_2=elite,cf:CSDN_4=Eric

CSDN_4 cf:CSDN_5=tom cf:CSDN_1=jakson,cf:CSDN_2=elite,CSDN_3=bob

2.2 博客表

Hbase中Rowkey的是根据字母顺序进行排序的,需要倒序进行排序,需要用到时间戳反转来设计rowkey,最新发布的博客在前。

表设计

csdn为每一位博主分配一个ID,Rowkey的设计根据时间戳来设计。

Rowkey cf:博客信息

CSDNIID+Long.MAX_VALUE - timestamp1 cf:title=‘大数据’,cf:content=‘大数据…’,cf:分栏=‘大数据.’

CSDNIID+Long.MAX_VALUE - timestamp2 cf:title=‘Java’,cf:content=‘HashMap的原理…’,cf:分栏=‘java’

CSDNIID+Long.MAX_VALUE - timestamp3 cf:title=‘python’,cf:content=‘大数据…’,cf:分栏=‘python’

CSDNIID+Long.MAX_VALUE - timestamp4 cf:title=‘人工智能’,cf:content=‘AI应用…’,cf:分栏=‘AI’

在hbase shell中创建博客表

create 'blog','cf'

假设一年发表10000篇博客,使用hbase客户端插入。

/**

    * 假设一个博主2022年发表10000篇博客

    * rowkey=博主ID_时间戳

    */

   @Test

   public void insertBlogData() throws Exception {

       List<Put> puts = new ArrayList<>();

       String bloggerId= "123";

       for(int j = 0 ;j<10000;j++){

           String title = "title_"+j;

           String content =  "content_"+j;

           String specaification = "bigdata_"+j;

           //rowkey

           String date = getDate("2022");

           String rowkey = bloggerId+"_"+(Long.MAX_VALUE-sdf.parse(date).getTime());

           Put put = new Put(Bytes.toBytes(rowkey));

           put.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("title"),Bytes.toBytes(title));

           put.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("content"),Bytes.toBytes(content));

           put.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("specaification"),Bytes.toBytes(specaification));

           puts.add(put);

       }

       table.put(puts);

   }

查询12月份发表的博客

/**

    * 查询某近2022年12月发表的博客

    */

   @Test

   public void scanByCondition() throws Exception {

       Scan scan = new Scan();

       String startRow = "123_"+(Long.MAX_VALUE-sdf.parse("20221231235959").getTime());

       String stopRow = "123_"+(Long.MAX_VALUE-sdf.parse("20221201000000").getTime());

       scan.withStartRow(Bytes.toBytes(startRow));

       scan.withStopRow(Bytes.toBytes(stopRow));

       ResultScanner rss = table.getScanner(scan);

       for (Result rs:rss) {

           System.out.print(Bytes.toString(CellUtil.cloneValue(rs.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("title")))));

           System.out.print("--"+Bytes.toString(CellUtil.cloneValue(rs.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("content")))));

           System.out.println("--"+Bytes.toString(CellUtil.cloneValue(rs.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("specaification")))));

       }

   }


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 分布式计算 Hadoop
HBase基础结构
HBase基础结构
|
存储 负载均衡 NoSQL
【HBase】(3)-HBase详细结构图
【HBase】(3)-HBase详细结构图
174 0
【HBase】(3)-HBase详细结构图
|
存储 分布式数据库 Hbase
一文讲清HBase的存储结构
讲清Hbase的存储结构。
4955 0
|
存储 算法 分布式数据库
HBase内部结构
之前有一篇文章已经大概的说了一下HBase的基本的概念和内部的一些构成的意思,比如表啊,列族啊之类的,这一篇再简单的说一下HBase的架构数据模型从大到小 namespace表空间:类似RDBMS中的库概念,当你想把一组表去统一的管理的时候可以使用得到,这种抽象为即将推出的多租户相关功能奠定了基础 配额管理:限制命名空间可以使用的资源量(即区域,表)。
1820 0
|
存储 分布式数据库 索引
|
存储 分布式数据库 API
|
3月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
125 4
|
2月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
89 4
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
39 3
|
2月前
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
62 3