1. 程式人生 > >hbase入門 一些簡單的查詢語句

hbase入門 一些簡單的查詢語句

這裡我們用一個學生成績表作為例子,對HBase的基本操作和基本概念進行講解:

下面是學生的成績表:
name     grade      course:math   course:art
Tom        1                87                    97

Jerry       2               100                   80

        這裡grad對於表來說是一個列,course對於表來說是一個列族,這個列族由兩個列組成:math和art,當然我們可以根據我們的需要在course中建立更多的列族,如computer,physics等相應的列新增入course列族.


        有了上面的想法和需求,我們就可以在HBase中建立相應的資料表啦!

1, 建立一個表格 scores 具有兩個列族grad 和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這一行的資料的列族新增一列 <math,87>

hbase(main):006:0> put 'scores', 'Tom', 'course:math', '87'

0 row(s) in 0.0040 seconds

6,給Tom這一行的資料的列族新增一列 <art,97>

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這一行的資料的列族新增一列 <math,100>

hbase(main):009:0> put 'scores', 'Jerry', 'course:math', '100'

0 row(s) in 0.0030 seconds

9,給Jerry這一行的資料的列族新增一列 <art,80>

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', ['course:']

ROW                          COLUMN+CELL

Tom                         column=course:art, timestamp=1224726394286, value=97

Tom                         column=course:math, timestamp=1224726377027, value=87

Jerry                        column=course:art, timestamp=1224726424967, value=80

Jerry                        column=course:math, timestamp=1224726416145, value=100

4 row(s) in 0.0200 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.disable Table("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