HBase基本命令與新版本Java API

簡介

有關HBase的安裝能夠參考hbase安裝java

咱們能夠經過hbase shell和hbase數據庫進行交互,也能夠經過Java-api和hbase數據庫交互,這裏咱們使用的是hbase-client。shell

主要是介紹2.0重大重構以後的api的基本使用。數據庫

hbase-java-api

命名空間

#列出全部命名空間
list_namespace    
#新建命名空間
create_namespace 'namespaceName' 
#刪除命名空間
drop_namespace 'namespaceName'    
#修改命名空間

表操做

create:建立表apache

exists:檢查表是否存在api

list:查看全部表dom

alter:修改表oop

delete:刪除列ui

disable:禁用表spa

is_enabled:查看錶是否禁用.net

desc\describe:查看錶結構

drop:刪除表

put:插入數據

count:統計表有多少行

get:獲取數據

scan:掃描表或者列

#列出全部表
list    
#列出指定命名空間下的全部表
list_namespace_tables 'namespaceName'    
#新建一個以命名空間namespaceName的表tableName,列族爲cf1。
create 'namespaceName:tableName', 'cf1'
create 'tablename','columnFamily1','columnFamily2'
create 'tablename',{NAME => 'columnFamily1',VERSIONS => 1, TTL => 214783647, BLOCKCACHE => false,IN_MEMORY=>false},{NAME=>'columnFamily2',VERSIONS=>1,TTL=>259200,BLOCKCACHE=>false,IN_MEMORY=>false}      
disable 'tableName'
#刪除表
drop 'tableName'
#查看錶內容,查看前5行數據
scan 'namespaceName:tableName', {LIMIT=>5} 
#插入  put tableName rowkey,"columnFamily:column","value"
put 'tableName', 'rowkey', 'columnFamilyName:columnName', 'value'
#查看 get rowKey
get 'tableName', 'rowkey'

刪除表中的列簇,先disable表,修改後enable表,嚴格區分大小寫

scan

查詢user表中的全部信息
scan 'user'

查詢user表中列族爲info的信息
scan 'user', {COLUMNS => 'info'}
scan 'user', {COLUMNS => 'info', RAW => true, VERSIONS => 5}

查詢user表中列族爲info和data的信息
scan 'user', {COLUMNS => ['info', 'data']}
scan 'user', {COLUMNS => ['info:name', 'data:pic']}
 
查詢user表中列族爲info、列標示符爲name的信息
scan 'user', {COLUMNS => 'info:name'}
 
查詢user表中列族爲info、列標示符爲name的信息,而且版本最新的5個
scan 'user', {COLUMNS => 'info:name', VERSIONS => 5}

查詢user表中列族爲info和data且列標示符中含有a字符的信息
scan 'user', {COLUMNS => ['info', 'data'], FILTER => "(QualifierFilter(=,'substring:a'))"}

查詢user表中row key爲rk0001,cell的值爲中國
scan 'user', 'rk0001', {FILTER => "ValueFilter(=,'binary:中國')"}

查詢user表中row key爲rk0001,列標示符中含有a的信息
scan 'user', 'rk0001', {FILTER => "(QualifierFilter(=,'substring:a'))"}

查詢user表中row key以rk字符開頭的
scan 'user',{FILTER=>"PrefixFilter('rk')"}

查詢user表中列族爲info,rk範圍是[rk0001, rk0003)的數據
scan 'user', {COLUMNS => 'info', STARTROW => 'rk0001', ENDROW => 'rk0003'}

查詢user表中指定範圍的數據
scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}

get命令也能夠使用如上所示的scan命令方式

基本命令

help:查看命令幫助

status:查看hbase狀態

version:查看hbase版本

快照

修改表名HBase沒有rename命令,能夠經過快照功能修改表名

//爲表建立快照,這時尚未複製數據
clone_snapshot 'tableSnapshot', 'newTableName'

//根據某個快照而建立新表,此時複製數據
snapshot 'tableName', 'tableSnapshot'

//刪除快照
delete_snapshot 'tableSnapshot'

Java API

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.2.0</version>
</dependency>
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class HBaseTest {

    private static final String ZOOKEEPER_QUORUM = "127.0.0.1:2181";

    public static final String TABLE_NAME = "test_tb";

    private Connection connection;

    private Configuration configuration;

    @Before
    public void setUp() throws IOException {
        configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", ZOOKEEPER_QUORUM);
        connection = ConnectionFactory.createConnection(configuration);
    }

    @Test
    public void createTable() throws Exception {
        Admin admin = connection.getAdmin();
        TableName tableName = TableName.valueOf(TABLE_NAME);

        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
        ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");
        ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info");
        tableDescriptorBuilder.setColumnFamily(baseInfo);
        tableDescriptorBuilder.setColumnFamily(extInfo);

        TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
        admin.createTable(tableDescriptor);
    }

    @Test
    public void dealTable() throws IOException {
        Admin admin = connection.getAdmin();
        String tableNameString = "test_user";
        TableName tableName = TableName.valueOf(tableNameString);
        if(admin.tableExists(tableName)){
            admin.disableTable(tableName);
            admin.deleteTable(tableName);
        }
    }

    @Test
    public void descTable() throws IOException {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        TableDescriptor tableDescriptor = table.getDescriptor();
        ColumnFamilyDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
        for(ColumnFamilyDescriptor cfd : columnFamilies){
            System.out.println(Bytes.toString(cfd.getName()));
        }
    }

    @Test
    public void put() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Put put=new Put(Bytes.toBytes("user_info_1"));
//        put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes("tim"));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes("123"));
        table.put(put);
    }

    @Test
    public void puts() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        LinkedList<Put> puts = new LinkedList<>();
        puts.add(getPut("user_info_2"));
        puts.add(getPut("user_info_3"));
        puts.add(getPut("user_info_4"));
        table.put(puts);
    }

    private static Put getPut(String rowKey){
        Put put=new Put(Bytes.toBytes(rowKey));
        Random random = new Random();
        String name = String.valueOf(random.nextInt(1000000));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes(name));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"), Bytes.toBytes(name));
        return put;
    }


    @Test
    public void get() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Get get =new Get(Bytes.toBytes("user_info_1"));
        get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"));
        Result result=table.get(get);

        List<Cell> cells = result.listCells();
        for(Cell cell: cells){
            System.out.println(Bytes.toString(cell.getFamilyArray()));
            System.out.println(Bytes.toString(cell.getQualifierArray()));
            System.out.println(Bytes.toString(cell.getValueArray()));
            System.out.println(cell.getTimestamp());
        }
    }

    @Test
    public void gets() throws IOException {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        LinkedList<Get> gets = new LinkedList<>();
        gets.add(getGet("user_info_1"));
        gets.add(getGet("user_info_2"));
        gets.add(getGet("user_info_3"));
        gets.add(getGet("user_info_4"));
        Result[] results = table.get(gets);
        for(Result result : results){
            System.out.println(new String(result.getRow()));
            System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"))));
            System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("tel"))));
        }
    }

    private static Get getGet(String rowKey){
        Get get =new Get(Bytes.toBytes(rowKey));
        get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"));
        get.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("tel"));
        return get;
    }

    @Test
    public void scan() throws IOException {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Scan s = new Scan();
        ResultScanner resultScanner = table.getScanner(s);
        for(Result result : resultScanner){
            byte[] row = result.getRow();
            System.out.println(new String(row));
            System.out.println(new String(result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("name"))));
        }
    }

    @Test
    public void deleteRowKey() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Delete de =new Delete(Bytes.toBytes("rowKey"));
        table.delete(de);
    }

    @Test
    public void deleteColumn() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Table table = connection.getTable(tableName);
        Delete de =new Delete(Bytes.toBytes("rowKey"));
        de.addColumn(Bytes.toBytes(""), Bytes.toBytes(""));
        table.delete(de);
    }

    @Test
    public void disableTable() throws Exception {
        TableName tableName = TableName.valueOf(TABLE_NAME);
        Admin admin = connection.getAdmin();
        admin.disableTable(tableName);
    }

    @Test
    public void listNamespace() throws Exception {
        Admin admin = connection.getAdmin();
        NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();
        for(NamespaceDescriptor namespaceDescriptor : namespaceDescriptors){
            System.out.println(namespaceDescriptor.getName());
        }
    }

    @Test
    public void listTables() throws IOException {
        Admin admin = connection.getAdmin();
        List<TableDescriptor> tableDescriptors = admin.listTableDescriptors();
        for(TableDescriptor tableDescriptor : tableDescriptors){
            System.out.println(tableDescriptor.getTableName().getNameAsString());
        }
    }
}

重點就是構建鏈接:

Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "127.0.0.1:2181");
Connection connection = ConnectionFactory.createConnection(configuration);

相關的操做基本和Admin有關,經過Connection獲取Admin:

Admin admin = connection.getAdmin();

再也不使用字符串代表,而是使用TableName抽象:

TableName tableName = TableName.valueOf("tableName");

表描述構建:

TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);

列簇構建:

ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");

下面的createTable基本把表相關的抽象都使用到了:

@Test
public void createTable() throws Exception {
    Admin admin = connection.getAdmin();
    TableName tableName = TableName.valueOf(TABLE_NAME);

    TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
    ColumnFamilyDescriptor baseInfo = ColumnFamilyDescriptorBuilder.of("base_info");
    ColumnFamilyDescriptor extInfo = ColumnFamilyDescriptorBuilder.of("ext_info");
    tableDescriptorBuilder.setColumnFamily(baseInfo);
    tableDescriptorBuilder.setColumnFamily(extInfo);

    TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
    admin.createTable(tableDescriptor);
}
相關文章
相關標籤/搜索