你的位置:首页 > Java教程

[Java教程]HBase入门


一、HBase基本概念

1、Row key

  行主键,在对HBase进行查询时候只能依靠Row key,HBase不支持条件查询等类似于一些主流数据库的查询方式,读取记录只能依赖行主键以及进行全局扫面,可以将行主键想象成主流数据库查询过程中用到的主键(例如,id)。

2、Column Family

  列族,可以将列族想象成日常主流数据库中的表结构的所有列的一个大管家,列族中存储了所有列的名称,整个表包括多少列,列族就包括多少(除去Row key和Timestamp列)。

3、Column

  列,HBase的每个列都隶属于一个列族,以列族名称作为前缀,同一列族中的所有列会聚集在一个存储单元上,同时按照Column key进行排序。

4、Timestamp

  在HBase中,通过row key 和 Colum Family确定一份数据,同一个row key和Colum Family可能有多份不同的数据,HBase通过时间戳来区分这些数据,同时按照时间戳对左右的数据进行排序,最新的数据排在最前面,时间戳默认为系统当前时间(精确到毫秒),同时也可以人为设置该值。

5、Value

  我们在HBase表中精确查询数据时,通过TableName找到表,接着通过Row key找到对应的行,然后通过ColumnKey找到相应的列,最后根据时间戳找到最新的需要查询的值,这个值就是value。

6、存储类型

  在HBase中,表名称是字符串,行键和列名称是二进制值(即就是Java中的Byte[]),时间戳是一个64为的整数(Java中的long类型),最后的查询结果Value是字节数组(Java中的byte[]类型)。

7、存储结构

  在HBase中,整个数据表是按照行键进行排序,每行包括任意数量的列,列和列之间通过列键进行排序,每列包括若干的数据,整个HBase的存储结构可以理解如下:

      Table (

        Row key,List(

          SortedMap(

            Column,list(

              Value,Timestamp

              )

            )

          )

        )

二、HBase基本Shell命令

1、创建表

  >>create 'table name','column family',...省略号代表后面可以追加若干列族

2、添加记录

  >>put 'table name','row key',‘column family:column name','data'

  >>put 'table name','row key','column family:column name','data',

  >>...

  上面语句表示向表中添加若干条记录,在data代表需要添加的数据,column family:column name代表在列族中的某一列中添加数据,每行中的列可以不同,每行可以有人一多的列。

3、查询

  由上面可以知道,HBase仅支持依靠Row key查询或者全表扫描,数据表按照row key的字典序进行排序,每行包含任意多的列,同时所有的列按照column key进行自动排序。

  >>get 'table name','row key'

4、更新

  >>put 'table name','row key','Column family name:Column name','data'

  上面这条语句代表将表中需要更新的数据的值更新为data。

5、条件查询

  >>get 'table name','row key',{COLUNM=>'Column family name:column name',VERSIONS=>n}

  上面这条语句代表查询表中column name这一列中的n条记录,每列有许多条记录,这些记录按照时间戳倒序进行排列

  >>get 'table name','row key',{COLUNM=>'Column family name:column name',TIMESTAMP=>time}

  上面这条语句代表查询表中column name这一列中时间戳大于time的所有记录。

6、删除记录

  >>delete 'table name','row key','Column family name:Column name'

  HBase中delete语句只能删除一列,上面这条语句代表删除列名称为Column name的所有数据。

  >>delete 'table name','row key'

  删除key row行中所有的数据

7、删除表

  >>disable 'table name'

  >>delete 'table name'

  删除表时候需要注意,HBase中必须先使表disable,然后使用delete语句。

二、通过Java Api操作HBase

1、加载配置

  将HBase下的hbase-site.

1 Configuration conf = new Configuration;2 conf=HBaseConfiguration.create(conf);3 //conf.addResource("hbase-site-cluster.//可以加载指定的文件

2、创建HBase表

1 /*---------------------创建表--------------------*/2 HTableDescriptor table = new HTableDescriptor("table-name");3 table.addFamily(new HColumnDescriptor("column family name1"));4 table.addFamily(new HColumnDescriptor("column family name2"));5 admin.createTable(table);

View Code

3、增加记录

1 /*----------------------增加记录-------------------*/2 Put put = new Put(Bytes.toBytes("row key"));3 put.add(Byte.toBytes("列族名称"),Bytes.toBytes("列名称"),Bytes.toBytes("内容"));4 put.add(Byte.toBytes("列族名称"),Bytes.toBytes("列名称"),Bytes.toBytes("内容"));5 put.add(Byte.toBytes("列族名称"),Bytes.toBytes("列名称"),Bytes.toBytes("内容"));6 put.add(Byte.toBytes("列族名称"),Bytes.toBytes("列名称"),Bytes.toBytes("内容"));7 table.put(put);

4、查询记录

1 /*-------------------根据row key查询---------------------*/2 Get get = new Get(Bytes.toBytes("row key"));3 Result result = table.get(get);4 for(KeyValue var:reslut){5   System.out.println("列族:"+Bytes.toString(var.getFamily()));6   System.out.println("数量:"+Bytes.toString(var.getQualifier()));7   System.out.println("值:"+Bytes.toString(var.getValue()));8   System.out.println("时间:"+Bytes.toString(var.getTimestamp()));    9 }

5、更新数据

1 /*-----------------更新数据---------------*/2 Get get = new Get(Bytes.toBytes("row key"));3 get.addColumn(Bytes.toBytes("列族"),Bytes.toBytes("列名"));4 assertThat(Bytes.toString(table.get(get).list.get(0).getValue()),is("原值"));5 Put put = new Put(Bytes.toBytes("行键"));6 put.add(Bytes.toBytes("列族"),Bytes.toBytes("列名"),Bytes.toBytes("新值"));7 table.put(put);

View Code

6、删除记录

 1 /*---------------删除记录----------------*/ 2 //删除指定的列 3 Delete delete = new Delete(Bytes.toBytes("行键")): 4 delete.deleteColumns(Bytes.toBytes("列族"),Bytes.toBytes("列名")); 5 table.delete(delete); 6 assertThat(table.get(get).list,nullValue)); 7 //删除所有的列 8 table.delete(delete); 9 assertThat(table.getScanner(scan).next),nullValue());10 //删除整个表11 admin.disableTable("表名");12 admin.delete("表名");13 assertThat(admin.tableExists("表名"),is(false));

View Code