Hbase 操作命令

文章目录

  • Hbase Shell 操作
    • 一,基本操作
      • 1,启动hbase
      • 2,命名空间操作命令
      • 3,表操作命令
    • 二,DML
    • 1,写入数据
    • 2,读取数据
    • 三、删除与版本介绍
    • 四、Hbase Java API操作

Hbase Shell 操作

一,基本操作

1,启动hbase

首先启动hbase: start-hbase.sh
Hbase 操作命令_第1张图片
进入hbase 命令行命令: hbase shell
Hbase 操作命令_第2张图片

2,命名空间操作命令

1,查看帮助命令: help 想要查看具体命令的话,需要加上引号 例如 help ‘create_namespace’
能够展示Hbase中所用能使用的命令,主要是使用的命令有 namespace 命令空间有关,DDL创建修改表格,DML写入读取数据.
输入help ‘create_namespace’ 下面例出了两种创建命名空间的语法格式
Hbase 操作命令_第3张图片
2, namespace 命名空间
创建命名空间: create_namespace 要先创建命名空间。然后在命名空间里面创建表格
在这里插入图片描述
3,查看命名空间: list_namespace 可以查看创建好了的所有的命名空间,系统自带的有两个,其中这个default 没写命名空间的时候就存储在default里面,NAMESPACE 是系统的命名空间,我们是不会人为的去用到的,有系统需要用到的表格
Hbase 操作命令_第4张图片
4,修改命名空间: alter_namespace

5,删除命名空间:drop_namespace

3,表操作命令

通过help帮助命令,可以看到有很多的创建方式
Hbase 操作命令_第5张图片
1,创建一个表
输入命令: create ‘bigdata:test1’,{NAME=>‘h1’,VERSIONS=>5}
创建表之前需要先创建一个命名空间,要是是在default默认空间里的话就可以省略命令空间
在这里插入图片描述
如果是在默认的命名空间default 里的话,是可以省略的,直接表名,如果没有其他的参数需要更改的话,直接加上两个列族就行
Hbase 操作命令_第6张图片
输入命令: describe ‘default:student’ 查看刚刚创建的表
可以看得到,我们直接加入了两个列族,h1和h2
Hbase 操作命令_第7张图片
想要创建多个列族和里面的参数的话,直接用逗号隔开
在这里插入图片描述
Hbase 操作命令_第8张图片
输入命令: list 可以查看所有的命名空间和表名 下面那种没有命名空间的就是在默认的命名空间default 下
Hbase 操作命令_第9张图片
2,修改表
表名创建时写的所有和列族相关的信息,都可以后续通过alter修改,包括增加删除列族,也是在修改操作里的
增加列族和修改信息都使用覆盖的方法,
没增加前前的 ‘bigdata:hbase1’ 的列族名和维护的版本
Hbase 操作命令_第10张图片
1)输增加列族命令:alter ‘bigdata:hbase1’,{NAME=>‘list1’,VERSIONS=>9},{NAME=>‘list2’,VERSIONS=>9}
Hbase 操作命令_第11张图片
查看修改之后的 ‘bigdata:hbase1’ 表里面的信息 发现增加了两个列族
Hbase 操作命令_第12张图片
2)修改’bigdata:hbase1’ 的 列族list1 的版本信息 从版本6改为3,修改列族信息的时候不要加大括号,直接列族名,后面跟要修改的参数
Hbase 操作命令_第13张图片
可以看到list1的版本号已经从6改为3了
Hbase 操作命令_第14张图片
3)删除列族的话有两种语法:
alter ‘bigdata:hbase1’, NAME=>‘list1’, METHOD=>‘delete’ 第一种 method的参数改为delete
Hbase 操作命令_第15张图片

alter ‘bigdata:hbase1’ ,‘delete’=> ‘list2’ 第二种delete 直接跟 列族名
我比较喜欢第二种
Hbase 操作命令_第16张图片
可以看到下面在table1和table2的列族已经不存在了
Hbase 操作命令_第17张图片
3,删除表
删除表需要drop命令,使用help查看,可以看到drop 命令的语法非常简单
Hbase 操作命令_第18张图片
先查看有哪些表
Hbase 操作命令_第19张图片
删除 ‘mydb1:mytbl’ 表 ,发现下面报错了
Hbase 操作命令_第20张图片
需要先把表标记为 disable 不可用,才能删除, 直接disable 加表名就可以了
Hbase 操作命令_第21张图片
输入命令: disable ‘mydb1:mytbl’ 修改后查看,可以看到已经成disable了
Hbase 操作命令_第22张图片
再进行删除表
在这里插入图片描述
删除成功,‘mydb1:mytbl’ 表不存在
Hbase 操作命令_第23张图片

二,DML

1,写入数据

在Hbase 中如果想要写入数据,只能添加结果中最底层的 cell ,可以手动加入时间戳指定的cell版本,推荐不写默认使用当前的系统时间
在hbase里面想要写入数据都使用put,想要修改的话也可以用他,是直接覆盖的,查看put的语法
Hbase 操作命令_第24张图片
输入命令: put ‘bigdata:hbase1’,‘1001’,‘list1:name’,‘zhangsan’
语法是 put 然后表名,然后是列族,列名是name,最后这个张三就是1001行,name列下的数据
在这里插入图片描述
要是是在同一行号,同一列下增加数据的话,就会覆盖
在这里插入图片描述
要是想在同一列下增加数据的话,直接把行号改了就行了
在这里插入图片描述
要是想增加多列的话,直接行号不变,修改列名增加数据就行了Hbase 操作命令_第25张图片

2,读取数据

读取数据使用get 和 scan
get最大的数据是一行数据,也可以进行列的过滤,读取数据的结果为多行cell
查看get和scan的使用方法
Hbase 操作命令_第26张图片
Hbase 操作命令_第27张图片
输入命令: get ‘bigdata:hbase1’ ,‘1003’ 直接get 表明加行号,所有的数据都读出来了,get只能读一行1的数据
Hbase 操作命令_第28张图片
要是想要指定查看哪些列的话,行号后面加上{COLUMN=>},里面是具体的列名,要是有多个的话,就用列表装起来Hbase 操作命令_第29张图片
如果想要读取多行数据的话,get就不行了,得使用scan扫描
scan可以扫描整张表,所有的行和所有的列
输入命令: scan ‘bigdata:hbase1’
Hbase 操作命令_第30张图片
输入命令: scan ‘bigdata:hbase1’,{STARTROW=>‘1001’,STARTROW=>‘1002’} ,可以指定扫描从哪里到哪里
Hbase 操作命令_第31张图片

三、删除与版本介绍

删除数据的方法有两个: delete 和 deleteall
这里就要涉及当初创建表的时候,设置的维护版本的问题

  1. delete 表示删除一个版本的数据,即为1个cell ,不填写版本,默认删除最新的那一个版本,他的意思是,VERSIONS=>3 ,要是设置的时候维护的版本号是3的话,然后第一次name设置的zahngsan,第二次name设置的是lisi,要是删除的话就是lisi,然后就会变成张三,只会删除最近的那个时间戳.
    Hbase 操作命令_第32张图片

delete ‘bigdata:hbase1’,‘1001’,‘list1:sex’ delete 加 表名加行名加 列名 删除sex列
在这里插入图片描述
删除之后,再次查看 1003 行的,sex列已经没有了,因为这里的VERSIONS设置的是1
Hbase 操作命令_第33张图片
把列族list1的版本号改为7,然后下面读取多个版本的数据
Hbase 操作命令_第34张图片
查看一行的多个版本的数据,COLUNM是列,VERSIONS=>7,读取的是7个版本的数据,但是具体是多少,还是要看当时创建列族的时候,版本号是多少
Hbase 操作命令_第35张图片
2) deleteall 表示删除所有版本的数据,即为当前行,当前列的多个cell。(执行命令会标记数据为要删除,不会直接将数据彻底删除,删除数据只在特定的时期清理磁盘时进行)
输入命令: deleteall ‘bigdata:hbase1’,‘1001’,‘list1:name’ 删除这个列所有的版本数据
在这里插入图片描述
再次查看这个1001 行 name的数据就为空了
Hbase 操作命令_第36张图片

四、Hbase Java API操作

package org.example;

import com.jcraft.jsch.IO;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;


import java.io.IOException;

import static org.example.HBaseDemoo.existsTable;

public class test_hbase {
    private static Connection connection;
    private static String nameSpaceName;
    //连接Hbase
    static{
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum","master,slave1,slave2");
        try {
            System.out.println("hello world!");
            connection = ConnectionFactory.createConnection(conf);
            System.out.println("Hello word2!");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
    //创建表空间
    public static void createNameSpace(String nameSpaceName) throws Exception{
        if (nameSpaceName == null || nameSpaceName.equals("")){
            System.out.println("nameSpace 名字不能为空");
            return;
        }
        Admin admin = connection.getAdmin();

        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(nameSpaceName);
        NamespaceDescriptor namespaceDescriptor = builder.build();
        try{
            admin.createNamespace(namespaceDescriptor);
            System.out.println("namespace 创建成功!");
        }catch (NamespaceExistException e){
            System.err.println(nameSpaceName + "名字已经存在!");
        }finally {
            admin.close();
        }
    }
    //创建表
    public static void createTable(String nameSpaceName,String tableName,String ... cfs) throws Exception{
        if(existsTable(nameSpaceName, tableName)){
            System.err.println((nameSpaceName == null || nameSpaceName.equals("")? "default" : nameSpaceName)  + ":" + tableName  + "表已存在?");
            return ;
        }
        Admin admin = connection.getAdmin();
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(nameSpaceName,tableName));
        if (cfs==null || cfs.length <= 1){ //cfs 列族
            System.err.println("至少指定一个列族");
        }
        assert cfs != null;
        for (String cf:cfs){
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(cf));
            ColumnFamilyDescriptor columnFamilyDescriptor = columnFamilyDescriptorBuilder.build();
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);
        }
        TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
        admin.createTable(tableDescriptor);
        byte [][] splitKeys= new byte[4][];
        splitKeys[0] = Bytes.toBytes("1000");
        splitKeys[1] = Bytes.toBytes("2000");
        splitKeys[2] = Bytes.toBytes("3000");
        splitKeys[3] = Bytes.toBytes("4000");
        // ['1000','2000','3000','4000']
        admin.createTable(tableDescriptor,splitKeys);

    }
    //判断表是否存在
    public static boolean exisTable(String nameSpaceName,String tableName) throws Exception{
        Admin admin = connection.getAdmin();
        return admin.tableExists(TableName.valueOf(nameSpaceName, tableName));
    }
    //put
    //里面的次数,按顺序依次为:表空间,表,行号,列族,列名,value
    public static void putData(String nameSpaceName,String tableName,String rowkey,String cf,String cl,String value) throws Exception{
        Table table = connection.getTable(TableName.valueOf(nameSpaceName,tableName));
        Put put = new Put(Bytes.toBytes(rowkey));
        put.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cl),Bytes.toBytes(value));
        table.put(put);
        table.close();

    }
    //delete
    //里面的参数,按顺序依次是:表空间,表,行号,列族,列名
    public static void deleteData(String nameSpaceName,String tableName,String rowkey,String cf,String cl) throws Exception{
        Table table = connection.getTable(TableName.valueOf(nameSpaceName,tableName));
        Delete delete = new Delete(Bytes.toBytes(rowkey));
        delete.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cl));
        table.delete(delete);
        table.close();
    }
    //get
    //里面的参数,按顺序依次是:表空间,表,行号,列族,列名
    public static void getData(String nameSpaceName,String tableName,String rowkey,String cf, String cl) throws Exception {
        Table table  = connection.getTable(TableName.valueOf(nameSpaceName,tableName));
        Get get = new Get(Bytes.toBytes(rowkey));
        get.addFamily(Bytes.toBytes(cf));
        get.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cl));
        Result result = table.get(get);
        Cell[] cells = result.rawCells();  //
        for (Cell cell : cells) {  //通过CellUtil 这个工具得到1001行下的数据,rowkey加上列族加上列 得到的就是那个值,所以才要用CellUtil取出来
            String cellString = Bytes.toString(CellUtil.cloneRow(cell))  + " : " +
                    Bytes.toString(CellUtil.cloneFamily(cell)) + " : " +
                    Bytes.toString(CellUtil.cloneQualifier(cell))+ " : " +
                    Bytes.toString(CellUtil.cloneValue(cell));

            System.out.println(cellString);
        }
        table.close();
    }
    //scan
    //里面的参数依次是,表空间,表,开始行,终止行
    public static void scanData(String nameSpaceName,String tableName,String startRow, String stopRow) throws Exception {
        Table table  = connection.getTable(TableName.valueOf(nameSpaceName,tableName));
        Scan scan = new Scan();
        //scan.withStartRow(Bytes.toBytes(startRow));
        //scan.withStopRow(Bytes.toBytes(stopRow));
        scan.withStartRow(Bytes.toBytes(startRow)).withStopRow(Bytes.toBytes(stopRow));
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String cellString = Bytes.toString(CellUtil.cloneRow(cell))  + " : " +
                        Bytes.toString(CellUtil.cloneFamily(cell)) + " : " +
                        Bytes.toString(CellUtil.cloneQualifier(cell))+ " : " +
                        Bytes.toString(CellUtil.cloneValue(cell));
                System.out.println(cellString);
            }
            System.out.println("-----------------------------------------------");
        }
        table.close();
    }


    public static void main(String[] args) throws Exception{
        //createNameSpace("HIVE");
        createTable("HIVE","hive2","h1","h2");
        //putData("HIVE","hive","1001","h1","name","wangwu");
        //deleteData("HIVE","hive","1001","h1","name"
        //getData("HIVE","hive","1001","h1","name");
        //scanData("HIVE","hive","1001","1001");

    }
}

你可能感兴趣的:(大数据,Hbase,hbase,database,nosql)