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

注:需要配置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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值