http://www.jb51.net/article/31172.htm 这个文章写得挺好

 

1.HBase的shell就和我们用Mysql的终端是一个意思,比如我们安装好Mysql,配置好了环境变量,命令行中输入mysql -uroot -p密码 就能直接进入mysql
的终端,在这里HBase也是一个意思。

如何进入HBase的终端呢,使用命令 hbase shell 进入命令行模式。在这里,我们能对HBase的操作是很有限的,在PPT19中,基本就包含了他百分之八九十的操作。
没有复杂的查询,因为复杂的查询不是HBase的强项,它能够进行海量数据的简单查询。


PPT19也有展示
创建表 create '表名称', '列族名称1','列族名称2','列族名称N'

    create '表名称' ,{NAME=>''},{NAME=>''},{NAME=>''},{NAME=>''}

      其中每一个花括号都是一个列族,花括号中的内容格式是一个或多个以逗号分隔的 xxx=>xxx,这个对列族做详细定义时使用的方式。=>左边的部分是名称,右边是值。

         举个例子:create 'user',{NAME=>'info',VERSIONS=>'5'},{NAME=>'detail',VERSION='4'}

        这表示创建表名为user的表,有两个列族,info和detail,info这个列族保留版本是数为5,detail列族保留版本数为4

      注意:创建表的时候,不需要指定行键,行键是默认存在的。在添加的时候,在表明后面,直接指定航简单 值就可以了。
添加记录 put '表名称', '行名称', '列名称:', '值'(如果不写时间戳,默认当前时间)
查看记录 get '表名称', '行键名称'
查看表中的记录总数 count '表名称'
删除记录 delete '表名' ,'行键名称' , '列名称'(删除指定行健所对应的那一整列)
删除一张表 先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称'
查看所有记录 scan "表名称" (全表扫描,类似SELECT * FROM 表名)
查看某个表某个列中所有数据 scan "表名称" , {COLUMNS=>'列族名称:列名称'}
更新记录 就是重写一遍进行覆盖,还是使用PUT操作

 

下面举例:
创建表: create 'user','user_id','adress','info'
创建表的时候,表名称和列族名称,都需要带引号,表与列族之间、列族与列族之间用逗号隔开,末尾不用分号结尾
查看表: list
list命令: 查看都有什么表,该命令列出了表的名称,没有具体的内容。
查看表具体信息:describe 'user'
describe 表名 查看某一个表的具体信息,表名需要用引号括起来。
该命令会显示很多的东西,虽然我们创建表的时候很简单,但是它有很多的默认值,在这里用这条命令,都会给你显示出来。
显示的内容分为左右两部分,左边的标题为DESCRIPTION,这是表的详细信息,右边是ENABLE,显示表是否启用。在左边的
详细信息部分中,最开始是表名称,然后会有很多的大括号,每个大括号中,都是列簇的信息,我们在创建表的时候只指定了列簇的名称,
其他的都没指定,但是他们都是有默认值的,在这里也都显示出来了。如果我们学的深入了,其实在创建表的时候,可以不像上面那么简单,
可以对这些参数进行设置的。
删除表: disabled 'user'
drop 'user'
插入记录: put 'user','zhangyifei','address:city','beijing'
put 'user','zhangyifei','info:age','22'
获取记录: get 'user','zhangyifei'
get 'user','zhangyifei','adress'
更新记录: put 'user','zhangyifei','info:age','24'
put 'user','zhangyifei','info:age','25'
put 'user','zhangyifei','info:age','26'
put 'user','zhangyifei','info:age','27'
get 'user','zhangyifei','info:age' 验证数据更新成功没有(默认显示最新的值)
获取版本信息 get 'user','zhangyifei','{COLUMN=>'info:age',VERSIONS} 显示的是最新的版本
get 'user','zhangyifei','{COLUMN=>'info:age',VERSIONS=>2} 显示的是最新2个的版本
get 'user','zhangyifei','{COLUMN=>'info:age',VERSIONS=>3} 显示的是最新的3个版本
get 'user','zhangyifei','{COLUMN=>'info:age',VERSIONS=>4} 显示的是最新的4个版本,却没有显示4个版本,只显示了3个,我们之前
确实插入了4次啊(24、25、26、27),原因是:我们用describe命令
查看表的详细信息的时候,在那个大括号中,是对列簇信息的描述,
其中有一项,就是版本数(VERSIONS=>'3'),我们在创建表的时候没有指定,它默认
是3.可以改成4,但是是在创建表的时候该。具体该怎么写呢,其实就是把
description下面的东西复制,然后前面加个create就行。
create 'user',{NAME=>'info',VERSIONS=>'5'},{NAME=>,VERSION=>},{}...

获取单元格数据的某个版本数据 get 'users','xiaoming',{COLUMN=>'info:age',TIMESTAMP=>1364874937056}
这里需要用知道具体的时间戳,时间戳如果不指定,就是当时的时间,但是我们以后很难知道当时时间是什么,
所以我们可以指定时间戳到底是什么。
全表扫描: scan 'user'


get 'users','xiaoming',{COLUMN=>'info:age',VERSION=>4}
get 'users','xiaoming',{COLUMN=>'info:age',VERSION=>1384092294281} 取某一条具体的值,也就是说,表名+列族:列名+时间戳 确定某一个具体的值
时间戳如果在插入的时候不指定,他是按当前时间来算的,那么再以后的查找的时候,我们不知道当时插入时候的当前时间,该怎么办。时间戳其实是可以在插入数据的时候自己指定的。
版本数在创建表的时候,需要指定。
scan 表 扫描整张表

get 命令是对某一行进行查找,查找时需要制定表名和行健
scan命令是对表进行全表扫描,查找时指定表名即可

删除某一列 delete 'users','xiaoming','info:age' 我们在删除列的时候会不会影响其他的记录,肯定不会,因为我们这个命令里面指明了行健xiaoming
删除某一条记录(行) deleteall 'user','xiaoming' (deteleall 表名,行健)
查看表的记录(行)数 count 'user'
清空表数据: truncate 'user' //实际上是执行3步操作,disabled、drop、create ,此时表示存在的,但是里面没数据

同一个表中的,两条记录,他们的列族是一样的,但是列族中的列可能是不一样的。所以可以这样说,列属于列族,同样也属于记录,即使我们有两行记录,都在
同一个列族下有一个同名的列,我觉得他们也没有什么关系,我们delete某一条记录的列,另一条记录是不受影响的。

hbase表中的每个列,都归属与某个列族。列族是表的schema的一部分(而列不是),必须在使用表之前定义。

 

以网上的一个学生成绩表的例子来演示hbase的用法。

name grad course
math art
Tom 5 97 87
Jim 4 89 80

这里grad对于表来说是一个只有它自己的列族,course对于表来说是一个有两个列的列族,这个列族由两个列组成math和art,当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族。

(1)建立一个表scores,有两个列族grad和courese

复制代码 代码如下:

hbase(main):001:0> create ‘scores','grade', ‘course'


可以使用list命令来查看当前HBase里有哪些表。使用describe命令来查看表结构。(记得所有的表明、列名都需要加上引号)

(2)按设计的表结构插入值:

复制代码 代码如下:

put ‘scores','Tom','grade:','5′  (course这个列族下面没有列,如果我后来再添加两个列,那么这次添加的数据放到哪里呢)
put ‘scores','Tom','course:math','97′
put ‘scores','Tom','course:art','87′
put ‘scores','Jim','grade','4′
put ‘scores','Jim','course:','89′ (course这个列族下面有两个列,为什么还可以省略,默认添加到哪个列呢)
put ‘scores','Jim','course:','80′


这样表结构就起来了,其实比较自由,列族里边可以自由添加子列很方便。如果列族下没有子列,加不加冒号都是可以的。

posted on 2017-03-06 22:55  Mr.He多多指教  阅读(473)  评论(0编辑  收藏  举报