一、获得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; } }