当前位置: 首页 > article >正文

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表,但是hbase是一个列式存储的表结构,与我们常用的mysql等关系型数据库的存储方式不同,mysql中的所有列的数据是按照行级别进行存储的,查询数据要整个一行查询出来,不想要的字段也需要查询出来,hbase是列式存储的方式实现的,它的一个列的所有行都是存储为一份文件,在大数据场景中我们一般一个表的字段都会比较多,那么我们业务很多情况下是不需要查询出来所有的列的,所以列式存储会大大的减少数据查询带来的消耗问题,为我们的查询增加效率。

我们已经知道了hbase是列级别存储的,那么我们看具体的存储结构

a

表中的数据结构rowkey是hbase表自带的主键,每个表中都会存在这样一个主键,它的格式为存储为Byte数组,什么样的数据都可以充当为rowkey进行存储,但是在存储的时候要转换为byte数组进行存储,并且数据是按照rowkey的字典顺序进行排序的

表中是存在列的,但是这个列以列族进行分类,比如info列族中存在三个列id,name,age 相应的列的存储数据类型也可以是任意的类型,但是都会以byte数组形式存储在hbase中

我们在使用hbase的表的时候,我们就按照上图的表格显示进行使用就可以了,但是实际的底层存储却不是我们所看到的样子

首先我们先要知道,hbase的表的数据操作分为两个类型,一个是put一个是delete,put是更新或者插入新的数据都使用这个命令它会自己覆盖数据,delete是删除数据,hbase的底层数据存储是hdfs,hdfs中的数据是不允许我们随意的进行操作和修改的,那么我们的所有操作都必须要先放入到自己的内存中然后在将数据写出到hdfs中,和hdfs中的数据进行合并处理,所以我们在hbase中真正存储的数据并不是按照表的样子进行存储的,底层是按照k-v类型存储到hbase中的,并且写出到hdfs中

我们在上面的表中可以看到数据的存储是按照表格形式存储的,但是表格形式的存储在hbase的底层数据中并不是真正存在的,而是kv类型存储的,其中存储的数据包含以下几个部分,key的组成是[rowkey主键,列族,列,时间戳和操作类型],其中rowkey是唯一性的主键,每个数据都必须和主键相关联,列族和列组成了相对应的存储描述,时间戳用于做数据的修改保存,用于识别最新的数据是什么,而不像是关系型数据库它的每个操作都会直接写出到数据上,我们只能在上层操作,并且操作完毕以后将数据一下写出到hdfs中进行最终保存,所以时间戳是必备项,同于我们识别数据的版本,能够认识到数据的变化流程,找出最新的数据,type类型用户识别操作是什么,从而最后得出数据最新值,value是我们每次操作对应的值

而且因为数据在底层存储是按照kv类型进行存的,那么我们会发现在不同的行的数据可能字段并不相同,并不是像关系型数据库中,列是固定死的,从而我们发现hbase的数据存储中能够固定死的就只有列族信息

在我们操作和使用hbase之前,先要知道以下几个比较重要的关键词

namespace

命名空间:相当于是关系型数据中的数据库概念。在hbase中可以根据不同的业务声明不同的命名空间,一个命名空间中会存在多个表,类似于数据库表的分类层级

table

hbase数据库中的表,和关系型数据库的表相同,但是这个表中我们只需要声明列族即可,不需要指定相应的列字段,因为不同的行中的数据是按照kv进行存储的,可以动态变化

row

hbase表中的一行内容,一行中会存在一个唯一的rowkey,以及很多用列族和列字段标识的值,hbase的表是列式存储的,那么一行中的不同列族是位于多个文件中的,在查询一整行内容的时候可能会需要用到多个底层存储文件才能获取到

column family

列族:表中的列的固定部分,其中一个列族中会包含很多个列,每个列并不是真实存在的,只是存储数据时候的一个描述而已,更像是kv数据中的一个简单的描述值,一个列族会单独存储到一个文件中,这个列族中所有的列都是存在一个文件中的

column

列:在一个列中的下一级的描述关键字

timestamp

操作时间戳,用于在数据多次操作的时候记录每一次操作的时间,用于标识数据的版本

cell

单元格:一个由行和列进行定位的数据位置叫做单元格信息,其中包含一个确定的值,这个值其实只是kv存储的一个单独的value值,会根据上面的timestamp时间戳存在多个版本


http://www.kler.cn/a/381545.html

相关文章:

  • js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)
  • RestTemplate关于https的使用详解
  • pdf有密码,如何实现pdf转换word?
  • qt QZipReader详解
  • 条款14 如果函数不抛出异常请使用noexcept
  • 论文解读——掌纹生成网络 RPG-Palm升级版PCE-Palm
  • vue前端面试题及答案2024
  • 飞书API-获取tenant_access_token
  • Melty 主体流程图
  • ctfshow文件包含web78~81
  • 八、1.STM32之DMA实验--DMA数据转运
  • 从传统服务器到虚拟化:虚拟机 VM 如何改变计算游戏规则?
  • 【spring】Cookie和Session的设置与获取(@CookieValue()和@SessionAttribute())
  • 企业HR如何选对一款智能招聘软件?
  • 加锁失效,非锁之过,加之错也|京东零售供应链库存研发实践
  • 【网络原理】深入理解关于HTTP协议和报文的格式以及重要的属性
  • web信息收集
  • FlaskFastAPIgunicornunicorn并发调用
  • 提高交换网络可靠性之链路聚合
  • RK3568开发板静态IP地址配置
  • oracle常用查询sql
  • EtherCAT转ModbusTCP相关技术
  • uniapp中echarts的正确集成方式:Vue2与Vue3组合式API双重视角
  • VMware虚拟机-Ubuntu设置共享文件夹
  • 若Git子模块的远端地址发生了变化本地应该怎么调整
  • OpenAI大事记;GPT到ChatGPT参数量进化