HBase概念及对比理解 对于我们常使用关系型数据库的来说,我们一般理解数据在数据库中的存储是下面这样子的:
有一张user表,表中数据如下:
id
name
sex
city
1
张三
男
北京
2
李四
男
上海
但是对于HBase来说,他的核心是Map,对于常规的Map,我们见到的如下所示:
1 2 3 4 5 6 { "id" : "1" , "name" : "张三" , "sex" : "男" , "city" : "北京" }
但是对于HBase并不是这样的,HBase有几个概念:Table,Row,Column,Colum Family,Colum Qualifier,Cell,Timestamp
Table :如关系型数据库一样,就是一张表
Row :HBase中的行,由一个行键和多个与之相关联的列组成。其中行键是按照字母进行排序的。
Colum :colum包含colum family和colum qualifier,中间用:分割
Cell :cell包含value和timestamp
上面这些是HBase中一个map中需要包含的,所以hbase中的map如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 { "1" : { "baseInfo" : { "name" : { 2637421 : "张三" } "sex" : { 2637421 : "男” 2637425:" 女” } } "otherInfo" : { "city" : { 2637421 :"北京" } } } "2:{ " baseInfo":{ " name":{ 2637421:" 李四" } " sex":{ 2637421:" 男” } } "otherInfo" : { "city" : { 2637421 :"上海" } } } }
上面这个Map就展示了HBase中map的结构,其中1和2是表中的row key ,baseInfo和otherInfo是colum family 建表时就需要声明好,name,sex和city是colum qulifier ,李四,男和上海是value ,2637421是timestamp 每更新一条数据,老数据会在新数据下面,只是时间戳被更新成最新的
如果搞成比较容易理解的表示方法,如下:
row key
cloum family
cloum family
name
sex
city
1
张三
男
北京
2
李四
男
上海
HBase使用: 了解了HBase的相关概念,那让我们看一下HBase是如何使用的吧:
安装: https://hbase.apache.org/book.html#quickstart 安装就对比这个官网这个quickstart进行简单的本地安装就可以了,够我们入门使用了。
命令行使用: 建表 :
1 create 'user','basicInfo','otherInfo'
其中:user是表名,basicInfo 和 otherInfo是Colum Family,需要注意的是:colum family是在建表时就需要指定的并且是不能修改的。
插入数据 :
1 2 3 put 'user' ,'1' ,'basicInfo:name' ,'张三' put 'user' ,'1' ,'basicInfo:sex' ,'男' put 'user' ,'1' ,'otherInfo:city' ,'北京'
如上表示插入在rowkey为1的数据
获取数据 :
1 2 3 4 5 6 get 'user' ,'1' colum cell basicInfo:name timestamp =1421762485768, value =张三 basicInfo:sex timestamp =1421762485768, value =男 otherInfo:city timestamp =1421762485768, value =北京
看到获取的这个数据是不是发现和上面介绍的概念和结构是一样的
SpringBoot中使用 依赖引入 :
1 2 3 4 5 <dependency > <groupId > com.spring4all</groupId > <artifactId > spring-boot-starter-hbase</artifactId > <version > $ {hbase-spring-boot-version} </version > </dependency >
HBase配置 :
1 2 3 4 ## HBase 配置 spring .data .hbase.quorum=xxxspring .data .hbase.rootDir=xxxspring .data .hbase.nodeParent=xxx
使用 :
我们使用spring为我们提供的HBaseTemplate来进行操作
**插入数据**:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Autowired private lateinit val hbaseTemplate:HBaseTemplate;fun set (key: String ,value: User ) { val saveOrUpdates = mutableArrayListof<Mutation>() val put = Put(convertKey(key)) val colums = convertUserToColums(value) for (colum in colums){ put.addColumn(colum.cloumFamily, colum.qualifier, colum.value) } saveOrUpdates.add(put) hbaseTemplate.saveOrUpdates("user" , saveOrUpdates) }
**获取数据**:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Autowired private lateinit val hbaseTemplate:HBaseTemplate;fun get (key: String ) :User { hbaseTemplate.saveOrUpdates("user" ,key, UserRowMapper()) }class UserRowMapper : RowMapper <User > { private const val COLUMN_FAMILY = "userInfo" .getBytes(); private const val NAME = "name" .getBytes(); private const val SEX = "sex" .getBytes(); override fun mapRow (result: Result , rowNum: Int ) : User { val name = result.getValue(COLUMN_FAMILY,NAME).toSting val sex = result.getValue(COLUMN_FAMILY,SEX).toSting return User(name,set ) } }
上面代码只是伪代码,未经过认证,详细使用还要实际使用过程中完善修改。
理解了以上的内容,HBase也算是大致入了个门,以后再有深入的学习,我会再记录下来,有问题的地方希望大家能给留言指出~