用能否判断HBase中损是否有这个表来判断能否连接上HBase
这里介绍两种连接方式,一种是旧版的(被淘汰的),一种是新版的
旧版:
//旧版:判断表是否存在 public static boolean old_TableExist(String tableName) throws IOException { //1、获取配置文件对象 HBaseConfiguration configuration = new HBaseConfiguration(); //相应配置文件信息 configuration.set("hbase.zookeeper.quorum","hadoop100"); //2、获取管理员对象 HBaseAdmin admin = new HBaseAdmin(configuration); //3、判断表是否存在 boolean exists = admin.tableExists(tableName); //4、关闭连接 admin.close(); return exists; }因为是要对表进行操作,所以是admin对象,旧版虽然也可以对表进行操作,但很多方法已经过时
新版:
//新版:判断表是否存在 public static boolean new_TableExist(String tablename) throws IOException { //1、获取配置文件信息 Configuration configuration = HBaseConfiguration.create(); //相应配置文件信息 configuration.set("hbase.zookeeper.quorum","hadoop100"); //2、获取管理员对象 Connection connection = ConnectionFactory.createConnection(configuration); Admin admin = connection.getAdmin(); //3、判断表是否存在 boolean exists = admin.tableExists(TableName.valueOf(tablename)); //4、关闭连接 admin.close(); return exists; }和旧表不一样的地方在于:
①configuration是通过HBaseConfiguration的create方法得到的;
②先获取connectio对象,在通过connection对象get到admin对象;
③传入tablename是要TableName类型的,而不是像旧版一样是用String、类型即可的。
在这里我们发现一个问题,我们每次操作都需要获取配置信息和关闭资源,这样会造成很大的资源浪费,能不能将获取配置信息和关闭资源分别集成起来统一操作呢?
规范:
public class CreateTable { private static Connection connection = null; private static Admin admin = null; static { try { Configuration configuration = HBaseConfiguration.create(); configuration.set("hbase.zookeeper.quorum","hadoop100"); connection = ConnectionFactory.createConnection(configuration); admin = connection.getAdmin(); } catch (IOException e) { e.printStackTrace(); } } public static void close(){ if (admin != null){ try { admin.close(); } catch (IOException e) { e.printStackTrace(); } } if (connection != null){ try { connection.close(); } catch (IOException e) { e.printStackTrace(); } } } public static boolean TableExist(String tableName) throws IOException { boolean exists = admin.tableExists(TableName.valueOf(tableName)); return exists; } public static void main(String[] args) throws IOException { System.out.println(old_TableExist("aaaaa")); System.out.println(TableExist("stu")); close(); } }通过设置静态代码块,使每次初始化前都将需要的配置完成。然后设置一个统一关闭资源的方法close,使用完成之后关闭资源。
操作结果:
创建表操作要注意的是:要创建表需要一个表描述器,要添加列族需要列族描述器
测试:
public static void main(String[] args) throws IOException { System.out.println(TableExist("stu2")); create("stu2", "info1","info2"); System.out.println(TableExist("stu2")); close(); }结果:
说明表创建成功!
这里要注意的是要先用之前写的判断表是否存在来筛选一遍,还有就是删除表前要先用disable使表下线
测试:
public static void main(String[] args) throws IOException { System.out.println(TableExist("stu2")); DropTable("stu2"); System.out.println(TableExist("stu2")); }结果:
删除成功!
这里有两点
①admin创建namespace需要namespaceDescriptor对象,而NamespaceDescriptor的构造器是私有的(private)
所以要构造NamespaceDescriptor需要通过内部类Builder中的build创建
但build对象的构造器也是私有的,所以要通过NamespaceDescriptor的一个静态方法create来创建Build对象
②就是为什么要使用NamespaceExistException异常,这个我们测试完再给大家分析:
测试:
public static void main(String[] args) { CreateNameSpace("1801"); }结果(运行一次):
可以看到已经创建成功了
再次运行,报异常打印的错误,说明NamespaceExistException是用来判断命名空间是否存在的。