• 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();
        }
    }
  • 相关阅读:
    django变量使用-在模板中使用视图函数中的变量
    django创建app、在视图函数及url中使用参数、url命名、通过redirect实现网页路径跳转
    第一个django项目-通过命令行和pycharm两种方式
    python安装虚拟环境virtualenvwrapper
    装饰器案例由来例子
    转发:python 装饰器--这篇文章讲的通俗易懂
    JVM调优之jstack找出最耗cpu的线程并定位代码
    mysql视图定义、原理、创建、使用
    列表生成 加1四种方法
    【good】在CentOS 6.x上安装GlusterFS
  • 原文地址:https://www.cnblogs.com/Transkai/p/10574913.html
Copyright © 2020-2023  润新知