javaAPI操作hbase对表格的增删改查

发布时间 2023-08-26 00:19:33作者: 林浅
package org.example;

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.apache.hadoop.ipc.Server;

import java.io.IOException;

public class HBaseDDL {
    //声明一个静态属性
    public static Connection connection =HBaseConnection_duo.connection;

    /**
     *
     * @param namespace:命名空间名称
     */

    public static void createNamespace(String namespace) throws IOException {
        // 1.获取admin
        //此处的异常先不要抛出,等待方法写完,在统一进行处理
        //admin的连接是轻量级的 不是线程安全的 不推荐池化或者缓存这个连接
        Admin admin = connection.getAdmin();

        //2.调用方法创建命名空间
        //代码相对shell更见底层,所以shell能实现的功能 代码一定能实现
        //所以需要填写完整的命名空间描述

        //2.1创建命名空间描述建造者 => 设计师
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

        //2.2 给命名空间添加需求
        builder.addConfiguration("user","atguigu");

        //2.3使用builder构造出对应的添加完整参数的对象 完成创建
        // 创建命名空间出现的问题 都属于本方法自身的问题 不应该抛出
        try {
            admin.createNamespace(builder.build());
        }catch (IOException e){
            e.printStackTrace();
        }

        //关闭admin
        admin.close();
    }

    /**
     *
     * @param namespace:命名空间名称
     * @param tablename:表格名称
     * @return true 表示存在
     */
    public static  boolean isTableExists(String namespace,String tablename) throws IOException {
        //1.获取admin
        Admin admin = connection.getAdmin();


        //2.使用方法判断表格是否存在
        boolean b = false;
        try {
            b = admin.tableExists(TableName.valueOf(namespace, tablename));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }


        //3.关闭连接
        admin.close();


        //4.返回结果
        return b;
    }

    /**
     *
     * @param namespace  命名空间名称
     * @param tableName     表格名称
     * @param columnFamilies  列族名称
     */
    public static void creatTable(String namespace ,String tableName,String... columnFamilies)  throws Exception {


        //判断是否至少有一个列族
        if (columnFamilies.length==0){
            System.out.println("创建表格至少有一个列族");
            return;
        }

        //判断表格是否存在
        if (isTableExists(namespace,tableName)){
            System.out.println("表格已经存在");
            return;
        }
        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.调用方法创建表格
        //2.1创建表格描述
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
        
        //2.2添加参数
        for (String columnFamily : columnFamilies){
            //2.3创建列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder
                    .newBuilder(Bytes.toBytes(columnFamily));

            //2.4添加版本参数
            columnFamilyDescriptorBuilder.setMaxVersions(5);

            //2.5创建添加完参数的列族描述
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
        }
        //创建对应的表格描述
        try {
            admin.createTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            System.out.println("表格已经存在");
            throw new RuntimeException(e);
        }
        admin.close();
    }

    /**
     *
     * @param namespace:命名空间名称
     * @param tableName:表格名称
     * @param columnFamily:列族名称
     * @param version:版本
     */
    public static void modifyTable(String namespace,String tableName,String columnFamily,int version) throws IOException {
        if (!isTableExists(namespace,tableName)){
            return;
        }

        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.调用方法修改表格
        //2.0获取之前的表格描述
        TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace,tableName));

        //2.1创建表格描述
        //如果使用填写tablename的方法 相当于创建了一个新的表格描述建造者 没有之前的信息
        //如果想要修改之前的信息  必须调用方法填写一个旧的表格描述
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);
        //2.2对应建造者进行表格数据的修改
        ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
        //创建列族描述者
        ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);
        //修改对应的版本
        columnFamilyDescriptorBuilder.setMaxVersions(version);
        //此处修改的时候 如果填写的是新创建的 那么别的参数也会初始化
        tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());

        try {
            admin.modifyTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }


        admin.close();
    }
    public static boolean deleteTable(String namespace,String tableName) throws IOException {
        //判断表格是否存在
        if (!isTableExists(namespace,tableName)){
            System.out.println("表格不存在,无法删除");
            return false;
        }
        //2.获取admin
        Admin admin = connection.getAdmin();

        //3.调用方法删除表格
        try {
            admin.deleteTable(TableName.valueOf(namespace,tableName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //4.关闭
        admin.close();
        return true;
    }
    public static void main(String[] args) throws Exception {
        //测试创建命名者空间
        //应该先保证连接没有问题 再来掉用方法
        //createNamespace("atguigu");


        //测试表格是否存在
       // System.out.println(isTableExists("bigdata","student"));

        //测试创建表格
        creatTable("atguigu","student","info","msg");
        //其他代码
        //测试修改表格
        modifyTable("atguigu","student","info",6);
        //测试删除表格
        deleteTable("atguigu","student");
        System.out.println("其他代码");
        //关闭habse连接
        connection.close();
    }
}