绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
HBASE的shell操作
2020-05-12 16:13:45

前言

我们知道hbase其实是架构在hdfs上的一个分布式数据库,既然是数据库那么这篇文章就主要围绕着我们熟悉的增删改查来做。当然了,其实hbase的shell操作在真实的企业中几乎不用,这个很简单,我们的hbase是用来存贮海量数据的,还用shell来操作,疯了吗?比如一个查询,可能shell界面会一直被刷,那么我为啥还会写这篇文章呢?其实主要是记录,重要的是通过他的shell操作能够更好的理解他的存贮本质以及他的架构,也能够为后面写API操作打下基础。

在具体开始介绍之前,需要先了解一个东西,那就是hbase采用是nosql语言,也就是和我们熟悉的mysql的语法差距有点大,好了,let's do it!

本文的命令不是重点:重点是知识点,都是知识点呀,同志们!

进入hbase客户端

个命令就是要进入hbase的客户端,直接敲击

hbase shell

help

接下来就要认识一个神级命令,没错,就是这个help,依稀记得小时候的那个学习机,哪里不会点哪里,有没有一起的同年记忆呀,暴露年龄了,不重要,hbase的help命令也是如此,你可以忘记所有的命令,但是这个命令一定要记住,哪里不会就哪里help就行了。

创建

有了这些前提,就让我们开始今天个创建命令,也就是所谓的增。

再说这个之前,先来普及一下知识点。认识一下什么叫做namespace。

我们想一想mysql,是不是有数据库呀?是的,hbase的namespace就是相当于mysql的数据库,数据库下面会可以创建表,hbase默认会有两个命名空间,分别为default和hbase。其中hbase这个命名空间是保存meta的,也就是元数据的,我们就不操作这个了。另外一个defalut在我们创建表的时候不指定的情况下,所有创建的表就会归类为这个命名空间,或者用熟悉的语言就是归类在这个数据库里面了。

好,就让我们先来直观体验一下吧,先来看看默认的两个命名空间,执行命令:

list_namespace

可以看到两个。

那你说我可以创建命名空间吗?我不想使用默认的default命名空间,当然可以了。

命令为:

create_namespace

这个时候,就懵逼了,知道了这个又能干啥,接下来就引入本文的重点了,另外一个神级操作,我现在知道这个是创建命名空间的,或者我根本不知道这个命令是干啥的,那么就直接敲击,放心,不会坏的,让我们看看发生了什么?

是不是超级棒,是的,不但给出了这个命令是干啥的,还给出了example例子,简直不要太爽啊,那我们就照着example敲击一下吧。

create_namespace 'ns1'

然后我们再来看一下现在的namespace列表

发现多了一个ns1命名空间,实际上在我们使用过程中,default命名空间就够了,这里是为了演示来创建一下的。

现在好了,我们有了命名空间了,就可以创建表了,在创建表之前,同样我们需要了解一个东西,那就是column family,有的把这个翻译为列族,有的翻译为列簇,其实都是一个意思,字面意思就是列的家族,是的,我认为翻译列族更加合适。这个有啥用吗?有的,hbase存贮数据是列式存贮的,如果你不懂什么叫列式存贮,请阅读我的另外一篇文章

栋公子:列式数据库和行式数据库的区别zhuanlan.zhihu.com图标

既然是列式存贮,我们就把很多相同的列的集合成为列族,在hbase中必须要创建列族,我们知道mysql中需要创建字段,hbase中完全不需要如此,只需要创建一个表名字,然后告诉这个表需要有几个列族即可,剩下的字段完全可以在插入的时候指定,可是说涉及到字段这个节点上来说完全没有任何规律可言,也不需要任何规律,OK,来创建一张表先。

创建语法:

create

再来说一下,create这个创建语法不会咋样?直接输入回车。就会看到下面这个提示,后面的演示就不再提示了。

可以看到,例子非常详尽,那就按照他的例子,来创建一个t1吧,还记得列族不,必须要指定列族,然后列族给他两个,分别为f1,f2

create 't2','f1','f2' # 种创建语法
create 't1',{NAME=>'f1'},{NAME=>'f2'} #第二种创建语法

实际上列族不宜创建过多,好不好要超过两个,因为在hdfs上的底层,每一个列族就是一个文件,如果列族过多,则需要查询的文件也很多,影响查询的性能。

接下来看另外一个知识点,都是知识点啊,要动脑筋记住呀!那就是versions版本。是的,hbase有一个很大的特点,那就是可以存贮多个版本,想象我们的mysql,同一行的数据,如果想要将原本的数字1改成数字2,这个时候常做的事情就是更新,但是在hdfs中就不一样了,这个数字1和数字2可以同时存在,对的,这个就是版本。我们在创建表的时候还可以指定版本,版本大为5,如果不指定则为1,下面是一个创建的例子。

create 't3', {NAME => 'f1', VERSIONS => '3'},{NAME => 'f2'}

对的,写上VERSIONS 然后指定一下就好了。

关于版本这里还有个小东西需要理解,比如我们指定了版本为3,那这下子来了5个内容咋办,开始的两条记录就会被删除了,只保留后的3条记录。

再来一个知识点,认识一下TTL,这个是超时时间,怎么说呢?比如创建了一个列族,然后指定了超时时间为200秒,是的,这个TTL的单位是秒,然后这个时候插入1条记录,然后过100s再插入一段时间,然后再过100s,次插入的记录就消失了,这个TTL的作用范围是每个Cell,不是整个表次创建的时间,这一点尤其重要。

另外,这个TTL在不指定的前提下,会显示forever,也就是,如果真的追究起来,他也是有一个值的,为2147483647 大约69.04年,这么些年,也就相当于了,如果说你的内容要存100年,那。。。

创建语法:

create 't1', {NAME => 'f1', TTL => 200}

比如上面,我就写了200s,也就是每个cell过200s就消失了。温馨提示,如果你的数据没有这种业务,好不要设置哟。

好了,还有一个小的知识点,那就是在特定的namespace下创建表

语法:

create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}

这个例子就是在ns1的namespace下面创建t1表,然后列族为f1,版本信息为5.

关于创建的时候,还可以进行预分区,不过这个知识点我留到我的下篇文章去全面介绍hbase的架构的时候来介绍,那个时候会说明的更明白一些。

添加数据

上面说完了创建,接下来让我们向表中添加数据。

语法:

put

这里还要普及一个知识点,那就是rowkey,翻译为行键,一个rowkey就是一行的ID

并且在整个列族内,记住不是整个表,而是列族,因为一张表中可以有多个列族,后期我还会写如何优雅的设计rowkey,这个在很多面试题中也经常被问到,可以说一个优雅的设计是非常重要的。我们这里是演示,就随便指定就好了。

添加条数据:

put 't1','rk0001','f1:name','wang'

意思是向t1表中添加rowkey为rk001,列族为f1中添加name字段的值wang。

其中name这个字段不单单理解为name,你可以在这里指定任何你想要的字段,包括空也是一个字段,再来一个例子。

put 't1','rk0001','f2:age','10'

向t1表中插入rowkey为rk0001,列族为f2,字段为age,value为10

查询

上面向表中插入了数据,那这些数据到底在哪里呢?我们去查询一下。

语法

get

例子:

1.获取t1表中rowkey为rk0001的所有信息

get 't1','rk0001'

2.获取t1表中rowkey为rk0001,列族为f1的所有信息

get 't1','rk0001','f1'

3.查看t1表中rowkey为rk0001,列族为f1,字段为name的内容

get 't1','rk0001','f1:name'

4.查看t1表中rowkey为rk0001,列族为f1,字段为name和age的内容

get 't1','rk0001','f1:name','f1:age'

5.查看t1表中rowkey为rk0001,列族为f1,f2

get 't1','rk0001','f1','f2'

6.获取t1表中rowkey为rk0001,然后cell的值为meimei的信息

get 't1', 'rk0001', {FILTER => "ValueFilter(=, 'binary:meimei')"}

7.获取t1表中rowkey为rk0001,cell的值中包含m的信息

get 't1','rk0001',{FILTER => "QualifierFilter(=,'substring:m')"}

8.全表扫描t1

scan 't1'

更新

这里也是一个知识点,那就是hbase理论上其实只有一种操作,就是写操作,所谓的更新和删除等其实都是写入操作,比如更新,其实就是新添加一条数据,然后添加一个版本,删除 也只是打上删除标记,这也是区别与mysql那种行式数据库的区别的地方。

更新还是用的插入的命令,比如下面

put 't1','rk0001','f2:age','11'

其实就是把t1表中rowkey为rk0001,列族为f2,age字段的值更新为11

查看表信息

desc 't1'

查看表t1的描述信息

更新列族f1的版本号为5

alter 't1',NAME=>'f1',VERSIONS=>5

再次查看一下

删除

语法:

delete

1.删除 t1表 ,rowkey为rk0001,f1:name的值

delete 't1','rk0001','f1:name'

2.删除t1表中的数据

truncate 't1'

3.删除整个t1表

disable 't1'
drop 't1'

这里需要注意一下,删除某个表前,需要先disable掉这个表。

总结

以上就是本文的全部内容了,如果觉得好,欢迎给个赞,或者关注本专栏,有了新的内容也会时间推送给你,关注不迷路哦,当然了本文只是列出了部分的内容,更多的内容可以查看help命令或者查看官方文档,有什么疑问也可以在下方给我留言哦!

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Hbase资料库
创建时间:2020-05-08 14:42:11
Hbase资料库一站式查询。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 小雨滴
    专家
  • Leila
    专家
  • 飘絮絮絮丶
    专家
戳我,来吐槽~