第六章:API实现HBase的DDL操作

it2024-11-01  8

注:需要配置Maven,并设置相关配置导入HBase的包

<dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.1</version> </dependency> </dependencies>

1、尝试连接上虚拟机中的HBase

用能否判断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,使用完成之后关闭资源。

操作结果:

2、创建表操作

//创建表,可传多个参数 public static void create(String tableName, String... cfs) throws IOException { //1、判断是否有列族信息 if (cfs.length == 0){ System.out.println("请设置列族信息!!"); return; } //2、判断表是否已存在 if (TableExist(tableName)){ System.out.println("该表已存在!!"); return; } //3、创建表描述器 HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName)); //4、循环添加列族信息 for (String cf : cfs){ //5、创建列族描述器 HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf); //设置最大版本数 hColumnDescriptor.setMaxVersions(3); //6、添加列族信息 hTableDescriptor.addFamily(hColumnDescriptor); } //7、创建表 admin.createTable(hTableDescriptor); }

创建表操作要注意的是:要创建表需要一个表描述器,要添加列族需要列族描述器

测试:

public static void main(String[] args) throws IOException { System.out.println(TableExist("stu2")); create("stu2", "info1","info2"); System.out.println(TableExist("stu2")); close(); }

结果:

说明表创建成功!

3、删除表操作

public static void DropTable(String tableName) throws IOException { //1、判断表是否存在 if (!TableExist(tableName)) { System.out.println(tableName + "表不存在!!"); return; } //2、先使表下线 admin.disableTable(TableName.valueOf(tableName)); //3、删除表 admin.deleteTable(TableName.valueOf(tableName)); }

这里要注意的是要先用之前写的判断表是否存在来筛选一遍,还有就是删除表前要先用disable使表下线

测试:

public static void main(String[] args) throws IOException { System.out.println(TableExist("stu2")); DropTable("stu2"); System.out.println(TableExist("stu2")); }

结果:

删除成功!

4、创建命名空间

public static void CreateNameSpace(String ns){ NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(ns).build(); try { admin.createNamespace(namespaceDescriptor); }catch (NamespaceExistException e){ System.out.println(ns + "命名空间已存在!"); } catch (IOException e) { e.printStackTrace(); } }

这里有两点

①admin创建namespace需要namespaceDescriptor对象,而NamespaceDescriptor的构造器是私有的(private)

所以要构造NamespaceDescriptor需要通过内部类Builder中的build创建

但build对象的构造器也是私有的,所以要通过NamespaceDescriptor的一个静态方法create来创建Build对象

②就是为什么要使用NamespaceExistException异常,这个我们测试完再给大家分析:

测试:

public static void main(String[] args) { CreateNameSpace("1801"); }

 结果(运行一次):

 

可以看到已经创建成功了

再次运行,报异常打印的错误,说明NamespaceExistException是用来判断命名空间是否存在的。

   

 

最新回复(0)