HBase_API_(HBaseDDL,对表的api)

发布时间 2023-09-19 22:30:16作者: 201812

对hbase数据表进行以下操作:

1.创建命名空间

2.判断表是否存在

3.创建表格

4.修改表格

5.删除表格

注意:对表格的操作要调用admin,对数据进行操作调用table(这篇博客没有涉及到)

package com.atguigu;

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 java.io.IOException;

/**
 *
 */
public class HBaseDDL {

    //声明静态属性
    //引用的方式获取到同一个链接
    public static Connection connection=HBaseConnection.connection;

    /**
     * 创建命名空间
     * @param namespace 命名空间
     */
    public static void createNamespace(String namespace) throws IOException {

        //1.获取admin
        //admin连接是轻量级的,不是线程安全,不推荐池化或者缓存这个连接
        //就是说用到的时候就去获取,用不到就关闭
        Admin admin = connection.getAdmin();

        //2.调用方法创建命名空间
        //填写完整的命名空间描述

        //2.1创建命名空间描述
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

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

        //2.3使用builder构造出添加物参数的对象完成创建
        //注意:创建命名空间所抛出的问题应该都属于该方法的本身问题,是不应该直接进行IOException抛出的
        try {
            admin.createNamespace(builder.build());
        } catch (IOException e) {
            System.out.println("命名空间已经存在");
//            throw new RuntimeException(e);
            e.printStackTrace();
        }

        //3.记得要关闭admin
        admin.close();

    }

    /**
     * 判断表格是否存在
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return  ture 表示表格存在
     */
    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);
            e.printStackTrace();
        }

        //3.关闭连接再返回!!!!!!!!!!!!!!!!!
        admin.close();


        return b;

    }


    /**
     * 创建表格
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param columnFamilies 列族
     *  String... 表示可变参数,用来接受不确定参数个数的。
     */
    public static  void createTable(String namespace, String tableName, String... columnFamilies) throws IOException {

        //先判断一下是否至少有一个列族
        //如果不加判断,因为是可变参数当参数为0的时候就会再try catch中才知道没有列族创建失败
        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){
            //列族建造者
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));;

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

            //创建添加完整的的表格描述
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());

        }

        //创建表格
        try {
            admin.createTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
//            throw new RuntimeException(e);
//            System.out.println("表格已经存在");
            e.printStackTrace();
        }


        //关闭admin
        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)){
            System.out.println("表格不存在,无法修改");
            return;
        }


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

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

        //2.2创建描述者
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);


        //获取之前的列族描述
        ColumnFamilyDescriptor columnFamily1 = descriptor.getColumnFamily(Bytes.toBytes(columnFamily));


        //2.3数据修改
        ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily1);

        //2.4修改对应版本
        columnFamilyDescriptorBuilder.setMaxVersions(version);

        tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());


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

        admin.close();


    }


    /**
     * 删除表格
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return true 表示删除成功
     * 注意:hbase再删除表格的时候需要先警用表格
     */
    public static boolean deleteTable(String namespace, String tableName) throws IOException {
        //判断表格是否存在
        if(!isTableExists(namespace,tableName)){
            System.out.println("表格不存在,无法删除");
            return false;
        }

        //进行删除表格
        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.调用方法删除表格
        try {
            //注意:要先禁用表格
            admin.disableTable(TableName.valueOf(namespace,tableName));
            admin.deleteTable(TableName.valueOf(namespace,tableName));


        } catch (IOException e) {
//            throw new RuntimeException(e);
            e.printStackTrace();
        }

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

        return true;

    }



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


        //1.测试创建命名空间
        //要先确定连接是否出现问题,再执行相应的方法如createNamespace方法
//        createNamespace("atguigu");

        //2.判断表格是否存在
//        System.out.println(isTableExists("default", "REQUEST"));


        //3.测试创建表格
//        createTable("atguigu","student","msg");


        //4.修改数据
//        modifyTable("atguigu","student","msg",6);


        //5.删除表格
        deleteTable("atguigu","student");


        System.out.println("--------------");


        //关闭hbase连接!!!!!!!!!!!!
        HBaseConnection.closeConnection();

    }
}