HBase API 的用法总结

一、获得connection

因为connection为重量级框架,而admin 和table 为轻量级框架,所以在进行操作前,需要先初始化一个connection

public class ConnectionUtil {

    //可以获取Connection对象的方法
    public  static Connection getConn() throws IOException {

        return ConnectionFactory.createConnection();

    }

    //关闭connection对象的方法
    public static void  close(Connection conn) throws IOException {

        if (conn !=null){

            conn.close();

        }

    }


}

二、针对NameSpace 的API

package com.atguigu.hbase.main;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by VULCAN on 2020/3/20
 */
public class NameSpaceUtil {

    private  static Logger logger= LoggerFactory.getLogger(NameSpaceUtil.class);

    //list_namespace 查询所有库
    public  static List<String> listNameSpaces(Connection conn) throws IOException {

        ArrayList<String> nameSpaces = new ArrayList<>();

        //获取一个Admin对象
        Admin admin = conn.getAdmin();

        //调用方法取得带有namespace信息的descriptor
        NamespaceDescriptor[] namespaceDescriptors = admin.listNamespaceDescriptors();

        for (NamespaceDescriptor namespaceDescriptor : namespaceDescriptors) {

            nameSpaces.add(namespaceDescriptor.getName());

        }

        //关闭admin
        admin.close();

        return nameSpaces;

    }

    //判断库是否存在
    public  static  boolean  ifNSExists(Connection conn,String nsName) throws IOException {

        //校验库名,当字符串为null或者空字符时,返回true
        if (StringUtils.isBlank(nsName)){

            logger.error("请输入正确的库名!");

            return false;
        }

        //获取一个Admin对象
        Admin admin = conn.getAdmin();

        try {
            //根据库名获取库的描述,如果库的描述不存在,抛出NamespaceNotFoundException
            admin.getNamespaceDescriptor(nsName);

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return  false;
        } finally {
            admin.close();
        }

    }


    // 创建库
    public  static  boolean  createNameSpace(Connection conn,String nsName) throws IOException {

        //校验库名
        if (StringUtils.isBlank(nsName)){

            logger.error("请输入正确的库名!");

            return false;
        }

        //获取一个Admin对象
        Admin admin = conn.getAdmin();

        try {
            //创建库的描述
                //此处只能用内部类bulid来创建descriptor对象
            NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(nsName).build();

            //根据库的描述创建库
            admin.createNamespace(namespaceDescriptor);

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;

        } finally {
            admin.close();
        }

    }

    // 删除库 只能删除空库,库中有表无法删除
    public  static  boolean dropNameSpace(Connection conn,String nsName) throws IOException {

        //判断库是否存在,不存在就不需要删除
        if (!ifNSExists(conn,nsName)){

            logger.error("当前库:"+nsName+",不存在!");

            return false;

        }

        //判断库是否是空库
        List<String> tablesInNameSpace = getTablesInNameSpace(conn, nsName);

        if (!tablesInNameSpace.isEmpty()){

            logger.error("当前库:"+nsName+",非空!");

            return false;

        }

        //获取一个Admin对象
        Admin admin = conn.getAdmin();

        try {
            //删库
            admin.deleteNamespace(nsName);

            return true;
        } catch (Exception e) {
            e.printStackTrace();

            return false;
        } finally {

            admin.close();

        }

    }

    //获取库中所有的表
    public static  List<String> getTablesInNameSpace(Connection conn,String nsName) throws IOException {

        ArrayList<String> tableNames = new ArrayList<>();

        //获取一个Admin对象
        Admin admin = conn.getAdmin();

        TableName[] tableNames1 = admin.listTableNamesByNamespace(nsName);
        for (TableName tableName : tableNames1) {
            tableNames.add(tableName.toString());
        }

        //关闭admin
        admin.close();

        return tableNames;


    }

}

三、针对表的操作

package com.atguigu.hbase.main;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * Created by VULCAN on 2020/3/20
 */
public class TableUtil {

    private  static Logger logger= LoggerFactory.getLogger(TableUtil.class);


    //判断表名是否合法,如果合法返回表的TableName,如果不合法,返回null
    public static TableName checkTableName(String tableName, String nsname){

        //验证表名是否合法
        if (StringUtils.isBlank(tableName)){

            logger.error("请输入正确的表名!");

            return null;

        }

        return  TableName.valueOf(nsname,tableName);

    }

    //判断表是否存在
    public static boolean ifTableExists(Connection connection, String tableName, String nsname) throws IOException {

        //验证表名是否合法
        TableName tn = checkTableName(tableName, nsname);

        if (tn==null){

            return false;
        }

        Admin admin = connection.getAdmin();

        boolean tableExists = admin.tableExists(tn);

        admin.close();

        return tableExists;

    }

    //创建表
    public static boolean createTable(Connection connection, String tableName, String nsname,String...cfs) throws IOException {

        //验证表是否存在
        if(ifTableExists(connection,tableName, nsname)){

            logger.warn(tableName+"已经存在!无需再创建!");

            return false;

        };

        TableName tn = checkTableName(tableName, nsname);

        if (cfs.length<1){

            logger.warn("至少需要指定一个列族!");

            return false;

        }

        Admin admin = connection.getAdmin();

        //创建表的描述和定义
        HTableDescriptor hTableDescriptor = new HTableDescriptor(tn);

        //列族需要在表的描述和定义中指定

        for (String cf : cfs) {

            //定义列族
            HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);

            //可以调用列族的set()方法设置列族的属性
           // hColumnDescriptor.setVersions()

            hTableDescriptor.addFamily(hColumnDescriptor);

        }
        //基于表的描述创建表
        admin.createTable(hTableDescriptor);

        admin.close();

        return true;

    }


    //删除表
    public static boolean dropTable(Connection connection, String tableName, String nsname) throws IOException {

        //验证表是否存在
        if(!ifTableExists(connection,tableName, nsname)){

            logger.warn(tableName+"不存在!无法删除!");

            return false;

        };

        //获取表名
        TableName tn = checkTableName(tableName, nsname);

        Admin admin = connection.getAdmin();

        //删除前,需要先disable表
        admin.disableTable(tn);

        //删除表
        admin.deleteTable(tn);

        admin.close();

        return true;

    }

}

猜你喜欢

转载自www.cnblogs.com/yangxusun9/p/12534742.html