Hbase Shell命令详解+API操作

HBase Shell 操作


3.1 基本操作
1.进入 HBase 客户端命令行,在hbase-2.1.3目录下


bin/hbase shell



2.查看帮助命令


hbase(main):001:0> help




3.查看当前数据库中有哪些表


hbase(main):002:0> list



3.2 表的操作


1.创建表


hbase(main):002:0> create 'student','info'


注意:删除字符的按键BackSpace的删除顺序是反过来的,即从左往右删。
2.插入数据到表


hbase(main):003:0> put 'student','1001','info:sex','male'
hbase(main):004:0> put 'student','1001','info:age','18'
hbase(main):005:0> put 'student','1002','info:name','Janna'
hbase(main):006:0> put 'student','1002','info:sex','female'
hbase(main):007:0> put 'student','1002','info:age','20'



3.扫描查看表数据


hbase(main):008:0> scan 'student'
hbase(main):009:0> scan 'student',{STARTROW => '1001', STOPROW => '1001'} 前闭后开
hbase(main):010:0> scan 'student',{STARTROW => '1001'}


4.查看表结构


hbase(main):0011:0> describe 'student'



5.更新指定字段的数据


hbase(main):012:0> put 'student','1001','info:name','Nick'
hbase(main):013:0> put 'student','1001','info:age','100'



6.查看【指定行】或【指定列族:列】的数据


hbase(main):014:0> get 'student','1001'
hbase(main):015:0> get 'student','1002','info:name'



7.统计表数据行数


hbase(main):021:0> count 'student'



8.删除数据
删除某 rowkey 的全部数据:


hbase(main):016:0> deleteall 'student','1001'



注意:删除操作默认的时间戳是当前时间。在 HBase 中,增删改数据都是打时间戳!!!
删除某rowkey的某一列数据:


hbase(main):017:0> delete 'student','1002','info:sex'



注意:shell删除操作会将数据的所有版本都删除掉。但是在 HBase 的 API 操作中可以细粒度的控制删除哪一个版本。

9.清空表数据


hbase(main):018:0> truncate 'student'



提示:清空表的操作顺序为先 disable,然后再 truncate。

10.删除表
首先需要先让该表为 disable 状态:


hbase(main):019:0> disable 'student'



然后才能 drop 这个表:


hbase(main):020:0> drop 'student'



提示:如果直接 drop 表,会报错:ERROR: Table student is enabled. Disable it first.

11.变更表信息
设置将info列族中的数据存放3个版本:


hbase(main):022:0> alter 'student',{NAME => 'info', VERSIONS => 3}
hbase(main):022:0> get 'student','1001',{COLUMN => 'info:name', VERSIONS => 3}


Hbase API操作

1.环境准备:

创建maven项目,更改pom.xml文件配置

<dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>1.1.3</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
    </dependencies>

2.API

一系列API操作集合如下:

package com.gec.demo;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;

import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;
import org.apache.hadoop.hbase.util.Bytes;
import sun.java2d.pipe.OutlineTextRenderer;

import java.io.IOException;

import static com.gec.demo.utli.getTable.getHTable;

public class HbaseOperation {
    static Admin admin = null;

    static Connection conn = null;

    static Configuration conf = null;

    static {
        // HBase配置文件
        conf = HBaseConfiguration.create();

        // 设置zookeeper地址
        conf.set("hbase.zookeeper.quorum", "hadoop-001");
        conf.set("hbase.zookeeper.property.clientPort", "2181");

        try {
            // 获取连接对象,执行
            conn = ConnectionFactory.createConnection(conf);
            admin = conn.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void close(Connection conn, Admin admin) {
        if (conn != null) {
            try {
                conn.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (admin != null) {
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static boolean isTableExistNewAPI(String tableName) throws MasterNotRunningException, ZooKeeperConnectionException, IOException {

        // HBase配置文件
        Configuration conf = HBaseConfiguration.create();

        // 设置zookeeper地址
        conf.set("hbase.zookeeper.quorum", "hadoop-001");
        conf.set("hbase.zookeeper.property.clientPort", "2181");

        // 获取连接对象,执行
        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        boolean tableExists = admin.tableExists(TableName.valueOf(tableName));

        // 关闭资源
        admin.close();

        return tableExists;
    }
    // 创建表
    public static void createTable(String tableName, String... columnFamily) throws IOException {

        if (isTableExistNewAPI(tableName)) {
            System.out.println("表" + tableName + "已存在!");
            return;
        }

        // 创建表描述器
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));

        // 添加列族
        for (String cf : columnFamily) {
            // 创建列描述器
            HColumnDescriptor HColumnDescriptor = new HColumnDescriptor(cf);
            // 指定列族的版本个数,默认个数是一个
            // HColumnDescriptor.setMaxVersions(5);
            hTableDescriptor.addFamily(HColumnDescriptor);
        }

        // 创建表操作
        admin.createTable(hTableDescriptor);
        System.out.println("表" + tableName + "创建成功!");
    }
    // 删除表
    public static void deleteTable(String tableName) throws IOException {

        if (isTableExistNewAPI(tableName)) {
            // 删除表之前先使表不可用(下线)
            admin.disableTable(TableName.valueOf(tableName));
            // 执行删除操作
            admin.deleteTable(TableName.valueOf(tableName));
            System.out.println("表" + tableName + "删除成功!");
        } else {
            System.out.println("表" + tableName + "不存在!");
        }
    }

    // 向表中插入数据(或修改)
    public static void putRowData(String tableName, String rowKey, String columnFamily, String column, String value) throws IOException {

        // 创建HTable对象
        // 旧API
        // HTable hTable = new HTable(conf, TableName.valueOf(tableName));
        // 获取Table对象
        // 新API
        Table table = conn.getTable(TableName.valueOf(tableName));

        Put put = new Put(Bytes.toBytes(rowKey));
        // 向Put对象中组装数据
        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));

        // 执行向表中插入数据的操作
        table.put(put);

        System.out.println("插入数据成功");

        table.close();

        // 批量插入数据提示:1、同一个RowKey下添加不同的列;2、不同的RowKey,可以将RowKey(Put)放到List集合。
    }

    // 删除多行数据
    public static void deleteData(String tableName, String rowKey, String columnFamily, String column) throws IOException {

        // 获取Table对象
        // 新API
        Table table = conn.getTable(TableName.valueOf(tableName));

        // 创建Delete对象
        Delete delete = new Delete(Bytes.toBytes(rowKey));

        // 向Delete对象中组装数据,如果不组装,则删除的是行键的数据(多行数据)
        // delete.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column)); // 慎用这个方法,删除某个版本(默认最新版本),保留旧的版本
        // delete.addColumns(Bytes.toBytes(columnFamily), Bytes.toBytes(column)); // 公司推荐使用这个方法,删除所有版本

        // 执行删除操作
        table.delete(delete);

        System.out.println("删除多行数据成功");

        table.close();
    }
    // 获取所有数据(全表扫描)
    public static void scanTable(String tableName) throws IOException {

        // 获取Table对象
        // 新API
        Table table = conn.getTable(TableName.valueOf(tableName));

        // 构建扫描器,指定扫描的起始行和结束行,不指定的话,表示扫描全表,还可以指定其他限定
        Scan scan = new Scan();
        // scan.setStartRow(startRow);
        // scan.setStopRow(stopRow);

        // 执行扫描全表操作
        ResultScanner resultScanner = table.getScanner(scan);

        for (Result result : resultScanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                System.out.println("行键:" + Bytes.toString(result.getRow())
                        + " 列族:" + Bytes.toString(CellUtil.cloneFamily(cell))
                        + " 列:" + Bytes.toString(CellUtil.cloneQualifier(cell))
                        + " 值:" + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }

        table.close();
    }
    // 获取某一行数据
    public static void getRowData(String tableName, String rowKey) throws IOException {

        // 获取Table对象
        // 新API
        Table table = conn.getTable(TableName.valueOf(tableName));

        // 新建一个Get对象
        Get get = new Get(Bytes.toBytes(rowKey));
        // 显示所有版本
        // get.setMaxVersions();
        // 显示指定版本
        // get.setMaxVersions(maxVersions);
        // 显示指定时间戳的版本
        // get.setTimeStamp();

        // 执行获取某一行数据的操作
        Result result = table.get(get);
        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            System.out.println("行键:" + Bytes.toString(result.getRow())
                    + " 列族:" + Bytes.toString(CellUtil.cloneFamily(cell))
                    + " 列:" + Bytes.toString(CellUtil.cloneQualifier(cell))
                    + " 值:" + Bytes.toString(CellUtil.cloneValue(cell))
                    + " 时间戳:" + cell.getTimestamp());
        }

        table.close();
    }
    // 获取某一行指定“列族:列”的数据
    public static void getRowQualifierData(String tableName, String rowKey, String columnFamily, String column) throws IOException {

        // 获取Table对象
        // 新API
        Table table = conn.getTable(TableName.valueOf(tableName));

        // 新建一个Get对象
        Get get = new Get(Bytes.toBytes(rowKey));
        // 指定要获取某一行的“列族:列”
        get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));

        // 执行获取某一行指定“列族:列”数据的操作
        Result result = table.get(get);
        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            System.out.println("行键:" + Bytes.toString(result.getRow())
                    + " 列族:" + Bytes.toString(CellUtil.cloneFamily(cell))
                    + " 列:" + Bytes.toString(CellUtil.cloneQualifier(cell))
                    + " 值:" + Bytes.toString(CellUtil.cloneValue(cell))
                    + " 时间戳:" + cell.getTimestamp());
        }

        table.close();
    }
}

猜你喜欢

转载自www.cnblogs.com/Transkai/p/10574913.html