HBase简单Java代码示例

这里我们用一个学生成绩表作为例子,对HBase的基本操作和基本概念进行讲解:
下面是学生的成绩表:

name grade course:math course:art
Tom 1 87 97
Jerry 2 100 80

这里grade对于表来说是一个列,course对于表来说是一个列族,这个列族由两个列组成:math和art,
当然我们可以根据我们的需要在course中建立更多的列族,如computer,physics等相应的列添加入course列族.
有了上面的想法和需求,我们就可以在HBase中建立相应的数据表啦!

  1. 建立一个表格 scores 具有两个列族grade 和courese

    hbase(main):002:0> create 'scores', 'grade', 'course'
    0 row(s) in 4.1610 seconds
    
  2. 查看当先HBase中具有哪些表

    hbase(main):003:0> list
    scores
    1 row(s) in 0.0210 seconds
    
  3. 查看表的构造

    hbase(main):004:0> describe 'scores'
    {NAME => 'scores', IS_ROOT => 'false', IS_META => 'false', FAMILIES => [{NAME => 'course', BLOOMFILTER => 'false', IN_MEMORY => 'false', LENGTH => '2147483647', BLOCKCACHE => 'false', VERSIONS => '3', TTL => '-1', COMPRESSION => 'NONE'}, {NAME => 'grade', BLOOMFILTER => 'false', IN_MEMORY => 'false', LENGTH => '2147483647', BLOCKCACHE => 'false', VERSIONS => '3', TTL => '-1', COMPRESSION => 'NONE'}]}
    1 row(s) in 0.0130 seconds
    
  4. 加入一行数据,行名称为 Tom 列族grad的列名为”” 值位1

    hbase(main):005:0> put 'scores', 'Tom', 'grade:', '1'
    0 row(s) in 0.0070 seconds
    
  5. 给Tom这一行的数据的列族添加一列

    hbase(main):006:0> put 'scores', 'Tom', 'course:math', '87'
    0 row(s) in 0.0040 seconds
    
  6. 给Tom这一行的数据的列族添加一列

    hbase(main):007:0> put 'scores', 'Tom', 'course:art', '97'
    0 row(s) in 0.0030 seconds
    
  7. 加入一行数据,行名称为 Jerry 列族grad的列名为”” 值位2

    hbase(main):008:0> put 'scores', 'Jerry', 'grade:', '2'
    0 row(s) in 0.0040 seconds
    
  8. 给Jerry这一行的数据的列族添加一列

    hbase(main):009:0> put 'scores', 'Jerry', 'course:math', '100'
    0 row(s) in 0.0030 seconds
    
  9. 给Jerry这一行的数据的列族添加一列

    hbase(main):010:0> put 'scores', 'Jerry', 'course:art', '80'
    0 row(s) in 0.0050 seconds
    
  10. 查看scores表中Tom的相关数据

    hbase(main):011:0> get 'scores', 'Tom'
    COLUMN                       CELL
    course:art                  timestamp=1224726394286, value=97
    course:math                 timestamp=1224726377027, value=87
    grade:                      timestamp=1224726360727, value=1
    3 row(s) in 0.0070 seconds
    
  11. 查看scores表中所有数据

    hbase(main):012:0> scan 'scores'
    ROW                          COLUMN+CELL
    Tom                         column=course:art, timestamp=1224726394286, value=97
    Tom                         column=course:math, timestamp=1224726377027, value=87
    Tom                         column=grade:, timestamp=1224726360727, value=1
    Jerry                        column=course:art, timestamp=1224726424967, value=80
    Jerry                        column=course:math, timestamp=1224726416145, value=100
    Jerry                        column=grade:, timestamp=1224726404965, value=2
    6 row(s) in 0.0410 seconds
    
  12. 查看scores表中所有数据courses列族的所有数据

    hbase(main):013:0> scan 'scores',{COLUMN=>['course']}        
    ROW                                      COLUMN+CELL                                                                                                        
     Jerry                                   column=course:art, timestamp=1441953970540, value=80                                                               
     Jerry                                   column=course:math, timestamp=1441953959676, value=100                                                             
     Tom                                     column=course:art, timestamp=1441953935469, value=97                                                               
     Tom                                     column=course:math, timestamp=1441953923125, value=87                                                              
    2 row(s) in 0.0640 seconds
    

上面就是HBase的基本shell操作的一个例子,可以看出,hbase的shell还是比较简单易用的,
从中也可以看出HBase shell缺少很多传统sql中的一些类似于like等相关操作,
当然,HBase作为BigTable的一个开源实现,而BigTable是作为 google业务的支持模型,
很多sql语句中的一些东西可能还真的不需要.
当然,通过程序我们也可以对HBase进行相关的操作.下面的程序就完成了上面shell操作的内容:

import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.util.Map;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.io.BatchUpdate;
import org.apache.hadoop.hbase.io.RowResult;
import org.apache.hadoop.hbase.io.Cell;
import org.apache.hadoop.hbase.util.Writables;
public class HBaseBasic {
    public static void main(String[] args) throws Exception {
        HBaseConfiguration config = new HBaseConfiguration();
        HBaseAdmin admin = new HBaseAdmin(config);
        if (admin.tableExists("scores")) {
            System.out.println("drop table");
            admin.disableTable("scores");
            admin.deleteTable("scores");
        }

        System.out.println("create table");
        HTableDescriptor tableDescripter = new HTableDescriptor("scores".getBytes());
        tableDescripter.addFamily(new HColumnDescriptor("grade:"));
        tableDescripter.addFamily(new HColumnDescriptor("course:"));
        admin.createTable(tableDescripter);
        HTable table = new HTable(config, "scores");

        System.out.println("add Tom's data");
        BatchUpdate tomUpdate = new BatchUpdate("Tom");
        tomUpdate.put("grade:", Writables.getBytes(new IntWritable(1)));
        tomUpdate.put("course:math", Writables.getBytes(new IntWritable(87)));
        tomUpdate.put("course:art", Writables.getBytes(new IntWritable(97)));
        table.commit(tomUpdate);

        System.out.println("add Jerry's data");
        BatchUpdate jerryUpdate = new BatchUpdate("Jerry");
        jerryUpdate.put("grade:", Writables.getBytes(new IntWritable(2)));
        jerryUpdate.put("course:math", Writables.getBytes(new IntWritable(100)));
        jerryUpdate.put("course:art", Writables.getBytes(new IntWritable(80)));
        table.commit(jerryUpdate);
        for (RowResult row : table.getScanner(new String[] { "course:" })) {
            System.out.format("ROW\t%s\n", new String(row.getRow()));
            for (Map.Entry<byte[], Cell> entry : row.entrySet()) {
                String column = new String(entry.getKey());
                Cell cell = entry.getValue();
                IntWritable value = new IntWritable();
                Writables.copyWritable(cell.getValue(), value);
                System.out.format(" COLUMN\t%s\t%d\n", column, value.get());
            }
        }
    }
}

输出如下:

drop table
09/07/11 08:51:59 INFO client.HBaseAdmin: Disabled scores
09/07/11 08:51:59 INFO client.HBaseAdmin: Deleted scores
create table
add Tom's data
add Jerry's data
ROW     Tom
  COLUMN        course:art      97
  COLUMN        course:math     87
ROW     Jerry
  COLUMN        course:art      80
  COLUMN        course:math     100