大数据学习之HBase——04Hbase API(逐渐完善)

package com.hjf.hbase.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Jiang锋时刻
 * @create 2020-04-16 16:08
 */
public class HelloBase {

    /**
     * 指定Zookeeper集群
     */
    static final String ZK_CONNECT_KEY = "hbase.zookeeper.quorum";
    static final String ZK_CONNECT_VALUE = "node02:2181,node03:2181,node04:2181";

    private static Connection conn = null;
    private static Admin admin = null;
    private static Table table = null;

    public static void main(String[] args) throws URISyntaxException, IOException {

        getConnection();
        getAdmin();
        /* ************************ 元数据操作 ************************ */
        // 创建表
//        createTable("t1", "cf1");

        // 删除表
//        deleteTable("t1");

        // 获取指定表所包含的列族
//        System.out.println(getColumnFamily("t1"));

        // 判断是否包含列族
//        boolean exsitsColumnFamily = isExsitsColumnFamily("t1", "cf1");
//        if (exsitsColumnFamily == true){
//            System.out.println("存在");
//        } else {
//            System.out.println("不存在");
//        }


        // 添加列族
//        addColumnFamily("t1", "cf3", "cf4");

        // 删除列族
//         deleteColumnFamily("t1", "cf3", "cf4");

        // 修改表
        // modifyTable(cf1,table, tableName);


        /* ************************ 数据库操作 ************************ */

//        putData("t1", "r2", "cf1", "name", "hjf");
        //putData("t1", "r2", "cf1", "name",2222222222222L,"sss");
//        getScann("t1");

//        getData("t1", "r1", "cf1", "name");
//        getData("t5", "r1", "cf1", "name", 3);

        close();
    }


    /**
     * 获取连接
     * @return
     */
    public static Connection getConnection(){
        // 创建一个Configuration类, 用于加载需要连接Hbase的各项配置
        Configuration conf = HBaseConfiguration.create();
        // 设置当前的程序去寻找的hbase在哪里
        conf.set(ZK_CONNECT_KEY, ZK_CONNECT_VALUE);
        // 创建Connection
        try {
            conn = ConnectionFactory.createConnection(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 获取Admin类
     * Admin类是HBase API中负责管理建表、改表、删表等元数据操作的管理接口
     * @return
     */
    public static Admin getAdmin() {
        try {
            admin = conn.getAdmin();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return admin;
    }

    /**
     * 判断表是否存在
     * @param table_name
     * @return
     * @throws IOException
     */
    public static boolean isExistsTable(String table_name) throws IOException {
        TableName tableName = TableName.valueOf(table_name);
        if (admin.tableExists(tableName)){
            return true;
        } else {
            return false;
        }
    }

    /**
     * 创建表
     * @param table_name    表名
     * @param cfs           列族列表
     */
    public static boolean createTable(String table_name, String ... cfs) throws IOException {
        if (isExistsTable(table_name)) {
            System.out.println(table_name + "表已存在!!!");
            return false;
        }
        // 如果没有传列族的参数
        if (cfs == null || cfs.length ==0 ){
            System.out.println("创建表时列族不能为空!!!");
            return false;
        }
        // 用表名的字符串来生成一个TableName的类
        TableName tn = TableName.valueOf(table_name);
        // 生成HTableDescriptor类
        HTableDescriptor table = new HTableDescriptor(tn);
        for (String cf: cfs){
            // 定义列族属性的方法都在HColumnDescriptor类里面
            // 创建HColumnDescriptor类, 用于指定列族
            HColumnDescriptor columnFamily = new HColumnDescriptor(cf);
            // 将列族添加到HTableDescriptor
            table.addFamily(columnFamily);
        }
        TableName tableName = table.getTableName();
        admin.createTable(table);
        System.out.println(tableName + "表创建成功!!!");
        return true;
    }

    /**
     * 删除表
     * @param table_name
     */
    public static boolean deleteTable(String table_name) throws IOException {
        if(!isExistsTable(table_name)){
            System.out.println(table_name + "表不存在!!!");
            return false;
        }
        TableName tableName = TableName.valueOf(table_name);
        // 禁用当前表, 删除表之前必须先禁用
        admin.disableTable(tableName);
        // 删除当前表
        admin.deleteTable(tableName);
        System.out.println(tableName + "表删除成功!!!");
        return true;
    }

    /**
     * 修改表属性
     * @param cf1
     * @param table
     * @param tableName
     */
    public static void modifyTable(HColumnDescriptor cf1, HTableDescriptor table, TableName tableName){
        // 修改列族属性:
        // cf1列族的压缩方式设置为GZ
        cf1.setCompactionCompressionType(Compression.Algorithm.GZ);
        // 把cf1的最大版本号修改为ALL_VERSIONS  ==> Integer.MAX_VALUE
        cf1.setMaxVersions(HConstants.ALL_VERSIONS);
        // 把列族的定义更新到表定义里面
        table.modifyFamily(cf1);
        // 此时对表的修改并没有真正执行下去, 只有当调用了Admin类来进行操作的时候对HBase的修改才真正开始执行。
        try {
            admin.modifyTable(tableName, table);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取表中包含的列族
     * @param table_name
     * @throws IOException
     */
    public static List getColumnFamily(String table_name) throws IOException {
        Table table = conn.getTable(TableName.valueOf(table_name));
        ArrayList<String> list = new ArrayList<String>();
        HTableDescriptor tableDescriptor = table.getTableDescriptor();
        for (HColumnDescriptor descriptor: tableDescriptor.getColumnFamilies()){
            list.add(descriptor.getNameAsString());
        }
        return list;
    }

    /**
     * 判断表中是否包含某一列族
     * @param table_name
     * @param cf
     * @return
     * @throws IOException
     */
    public static boolean isExsitsColumnFamily(String table_name, String cf) throws IOException {
        if (!isExistsTable(table_name)){
            // System.out.println(table_name + "表不存在!!!");
            return false;
        }
        List lists = getColumnFamily(table_name);
        if (lists.contains(cf)){
            // System.out.println(table_name + "表中包含" + cf + "列族");
            return true;
        } else {
            // System.out.println(table_name + "表中不包含" + cf + "列族");
            return false;
        }
    }

    /**
     * 添加列族
     * @param table_name    表名
     * @param cfs           列族列表
     */
    public static void addColumnFamily(String table_name, String ... cfs) throws IOException {
        if (!isExistsTable(table_name)){
            System.out.println(table_name + "表不存在");
            return;
        }

        TableName tableName = TableName.valueOf(table_name);
        for (String cf: cfs){
            if (isExsitsColumnFamily(table_name, cf)){
                System.out.println("添加失败!" + table_name + "表中已存在" + cf + "列族!!!");
                return;
            }

            HColumnDescriptor newCf = new HColumnDescriptor(cf);
            admin.addColumn(tableName, newCf);
        }
        System.out.println(table_name + "表添加列族成功!!!");
    }

    /**
     * 删除列族
     * @param table_name    表名
     * @param cfs           列族列表
     * @throws IOException
     */
    public static void deleteColumnFamily(String table_name, String ... cfs) throws IOException {
        if (!isExistsTable(table_name)){
            System.out.println(table_name + "表不存在!!!");
            return;
        }
        TableName tableName = TableName.valueOf(table_name);

        for (String cf: cfs){
            if(!isExsitsColumnFamily(table_name, cf)){
                System.out.println("删除失败!" + table_name + "表中没有" + cf + "列族!!!");
                return;
            }
        }
        admin.disableTable(tableName);
        for (String cf: cfs){
            admin.deleteColumn(tableName, cf.getBytes("UTF-8"));
        }
        System.out.println("删除列族成功!!!");
    }

    /**
     * 插入数据[没有时间戳]
     * @param table_name    表名
     * @param rowkey        rowkey
     * @param familyName    列族
     * @param columnName    列
     * @param value         值
     */
    public static void putData(String table_name, String rowkey, String familyName, String columnName, String value) throws IOException {

        // 如果表不存在,则先创建表
        if (! isExistsTable(table_name)){
            createTable(table_name, familyName);
        }
        TableName tableName = TableName.valueOf(table_name);
        table = conn.getTable(tableName);
        Put put = new Put(Bytes.toBytes(rowkey));

        put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
        // 调用Table接口的put方法把数据真正保存起来:
        table.put(put);
        System.out.println("插入数据成功!!!");
    }

    /**
     * 插入数据[有时间戳]
     * @param table_name
     * @param rowkey
     * @param familyName
     * @param columnName
     * @param timestamp
     * @param value
     * @throws IOException
     */
    public static void putData(String table_name, String rowkey, String familyName, String columnName, long timestamp, String value) throws IOException {
        if (timestamp < 0){
            System.out.println("时间戳不能为负数!!!");
            return;
        }

        // 如果表不存在,则先创建表
        if (! isExistsTable(table_name)){
            createTable(table_name, familyName);
        }

        TableName tableName = TableName.valueOf(table_name);
        table = conn.getTable(tableName);
        Put put = new Put(Bytes.toBytes(rowkey));

        put.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(columnName), timestamp, Bytes.toBytes(ByteBuffer.wrap(value.getBytes("UTF-8"))));
        // 调用Table接口的put方法把数据真正保存起来:
        table.put(put);
        System.out.println("插入数据成功!!!");
    }


    public static void getScann(String table_name) throws IOException {
        if (!isExistsTable(table_name)){
            System.out.println(table_name + "表不存在!!!");
            return;
        }
        TableName tableName = TableName.valueOf(table_name);
        Table table = conn.getTable(tableName);
        Scan scan = new Scan();
        ResultScanner results = table.getScanner(scan);
        for (Result result: results){
            System.out.println(result);
        }
        results.close();

    }

    /**
     * 获取表中rowkey指定列的数据
     * @param table_name        表名
     * @param rowkey            rowkey
     * @param columnFamily      列族
     * @param column            列
     * @throws IOException
     */
    public static void getData(String table_name, String rowkey, String columnFamily, String column) throws IOException {
        if (!isExistsTable(table_name)){
            System.out.println(table_name + "表不存在!!!");
            return;
        }
        TableName tableName = TableName.valueOf(table_name);
        Table table = conn.getTable(tableName);
        Get get = new Get(Bytes.toBytes(rowkey));
        Result result = table.get(get);
        byte[] value = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
        System.out.println(Bytes.toString(value));
    }

    /**
     *
     * @param table_name
     * @param rowkey
     * @param columnFamily
     * @param column
     * @param version           打印版本数量
     * @throws IOException
     */
    public static void getData(String table_name, String rowkey, String columnFamily, String column, int version) throws IOException {
        if (!isExistsTable(table_name)){
            System.out.println(table_name + "表不存在!!!");
            return;
        }
        TableName tableName = TableName.valueOf(table_name);
        Table table = conn.getTable(tableName);
        Get get = new Get(Bytes.toBytes(rowkey));
        // 设置打印的版本数量
        get.setMaxVersions(version);
        // 获取Result对象
        Result result = table.get(get);
        // 用getColumnCells()方法获取到指定列的多个版本值
        List<Cell> cells = result.getColumnCells(Bytes.toBytes(columnFamily), Bytes.toBytes(column));

        for (Cell cell: cells){
            /*
                此处不用getValue()方法直接获取的原因是:
                调用getValue()方法会获取整个Cell的数组备份, 比较耗时.
                如果需要获取cell中的值时, 最好使用CellUtil.cloneValue
             */
            // 调用CellUtil.cloneValue来获取cell中的值
            // byte[] cValue = cell.getValue();     //最好不用
            byte[] cValue = CellUtil.cloneValue(cell);
            System.out.println(Bytes.toString(cValue));
        }

    }

    /**
     * 关闭链接
     */
    public static void close(){
        try {
            admin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            conn.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值