五十二、HBase的API操作

前几篇文章我们介绍了HBase的原理以及安装部署、命令行操作等知识,本文我们来看一下HBase的API操作。关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~


目录

一、环境准备

二、HBase API操作

2.1 获取HBase连接对象

2.2 判断命名空间是否存在

2.3 判断HBase中是否存在某张表

2.4 创建表

2.5 操作表

2.6 删除表

2.7 删除表数据

三、完整代码


 

一、环境准备

首先需要新建工程并导入相关的依赖,如下所示:

    <dependencies>

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

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

    </dependencies>

二、HBase API操作

2.1 获取HBase连接对象

首先需要把hbase-site.xml配置文件拷贝到resources目录下:

通过以下代码获取连接对象:

        //1、创建配置对象,获取HBase连接
        Configuration conf = HBaseConfiguration.create();

        //2、获取HBase连接对象
        Connection conn = ConnectionFactory.createConnection(conf);
        System.out.println(conn);

我们可以通过控制台打印一下,结果如下:

出现了上面的结果,说明连接成功。

2.2 判断命名空间是否存在

通过以下方式判断HBase中是否存在某个命名空间,如果不存在则创建命名空间:

    /**
     * 判断HBase中是否存在命名空间
     *
     * @param namespace 命名空间的名称
     * @param admin     操作对象
     * @throws IOException
     */
    public static void isNamespaceExist(String namespace, Admin admin) throws IOException {
        try {
            //判断表空间是否存在,不存在会抛出异常
            admin.getNamespaceDescriptor(namespace);
        } catch (NamespaceNotFoundException e) {
            //创建表空间
            NamespaceDescriptor nd = NamespaceDescriptor.create(namespace).build();
            admin.createNamespace(nd);
        }
    }

完整代码会在文章最后给出!!! 

通过命令行,我们可以发现已经成功创建了命名空间:

2.3 判断HBase中是否存在某张表

通过一下方法判断HBase中是否存在某张表,返回布尔类型的结果:

    /**
     * 判断HBase中是否存在某张表
     *
     * @param tableName 表名
     * @param admin     操作对象
     * @return 返回true or false
     * @throws IOException
     */
    public static boolean isTableExist(String tableName, Admin admin) throws IOException {
        TableName tn = TableName.valueOf(tableName);
        boolean b = admin.tableExists(tn);
        return b;
    }

在控制台输出如下结果:

因为这里我们已经创建了该表,所以会返回true。

2.4 创建表

如果不存在某张表,可以使用如下方法创建表:

    /**
     * 创建HBase表
     *
     * @param tableName    表名
     * @param admin        操作对象
     * @param columnFamily 列族
     * @throws IOException
     */
    public static void createTable(String tableName, Admin admin, String... columnFamily) throws IOException {
        //判断表是否存在
        boolean b = isTableExist(tableName, admin);
        if (b) {
            System.out.println(tableName + "已经存在!");
        } else {
            //创建表描述对象
            HTableDescriptor td = new HTableDescriptor(tableName);

            //增加列族
            for (String cf : columnFamily) {
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
                td.addFamily(hColumnDescriptor);
            }

            admin.createTable(td);
            System.out.println(tableName + "表创建成功!");
        }
    }

2.5 操作表

可以通过以下方法向HBase中插入数据或者从HBase中查询数据:

    /**
     * 操作表
     *
     * @param connection 连接对象
     * @param tableName  表名
     * @throws IOException
     */
    public static void execTable(Connection connection, String tableName) throws IOException {
        TableName tn = TableName.valueOf(tableName);
        Table table = connection.getTable(tn);

        //查询数据
        String rowkey = "1001";
        Get get = new Get(Bytes.toBytes(rowkey));
        Result result = table.get(get);
        boolean empty = result.isEmpty();
        System.out.println(tableName + "表中是否存在该条数据:" + !empty);

        if (empty) {
            //插入数据
            Put put = new Put(Bytes.toBytes(rowkey));

            String family = "info";
            String column = "name";
            String value = "fq";

            put.addColumn(Bytes.toBytes(family), Bytes.toBytes(column), Bytes.toBytes(value));

            table.put(put);
            System.out.println("插入数据成功!");
        } else {
            //展示数据
            for (Cell cell :
                    result.rawCells()) {
                System.out.println("family = " + Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("rowkey = " + Bytes.toString(CellUtil.cloneRow(cell)));
                System.out.println("value = " + Bytes.toString(CellUtil.cloneValue(cell)));
                System.out.println("column = " + Bytes.toString(CellUtil.cloneQualifier(cell)));
            }
        }

    }

当表中没有数据的时候会执行插入操作,结果如下所示:

当表中有数据的时候会读取数据,如下所示:

2.6 删除表

通过以下方法删除HBase中的某张表:

    /**
     * 删除表
     *
     * @param tableName 表名
     * @param admin     操作对象
     * @throws IOException
     */
    public static void delTable(String tableName, Admin admin) throws IOException {
        TableName tn = TableName.valueOf(tableName);

        if (admin.tableExists(tn)) {
            //禁用表
            admin.disableTable(tn);

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

2.7 删除表数据

通过以下方法删除对应表中的数据:

    /**
     * 删除表数据
     *
     * @param tableName  表名
     * @param connection 连接对象
     * @throws IOException
     */
    public static void delData(String tableName, Connection connection) throws IOException {
        TableName tn = TableName.valueOf(tableName);

        Table table = connection.getTable(tn);

        String rowkey = "1001";
        Delete delete = new Delete(Bytes.toBytes(rowkey));
        table.delete(delete);
    }

三、完整代码

package com.xzw.hbase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * @author: xzw
 * @create_date: 2021/3/15 9:34
 * @desc: 测试HBase API
 * @modifier:
 * @modified_date:
 * @desc:
 */
public class HBaseAPI {

    /**
     * 判断HBase中是否存在命名空间
     *
     * @param namespace 命名空间的名称
     * @param admin     操作对象
     * @throws IOException
     */
    public static void isNamespaceExist(String namespace, Admin admin) throws IOException {
        try {
            //判断表空间是否存在,不存在会抛出异常
            admin.getNamespaceDescriptor(namespace);
        } catch (NamespaceNotFoundException e) {
            //创建表空间
            NamespaceDescriptor nd = NamespaceDescriptor.create(namespace).build();
            admin.createNamespace(nd);
        }
    }

    /**
     * 判断HBase中是否存在某张表
     *
     * @param tableName 表名
     * @param admin     操作对象
     * @return 返回true or false
     * @throws IOException
     */
    public static boolean isTableExist(String tableName, Admin admin) throws IOException {
        TableName tn = TableName.valueOf(tableName);
        boolean b = admin.tableExists(tn);
        return b;
    }

    /**
     * 创建HBase表
     *
     * @param tableName    表名
     * @param admin        操作对象
     * @param columnFamily 列族
     * @throws IOException
     */
    public static void createTable(String tableName, Admin admin, String... columnFamily) throws IOException {
        //判断表是否存在
        boolean b = isTableExist(tableName, admin);
        if (b) {
            System.out.println(tableName + "已经存在!");
        } else {
            //创建表描述对象
            HTableDescriptor td = new HTableDescriptor(tableName);

            //增加列族
            for (String cf : columnFamily) {
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
                td.addFamily(hColumnDescriptor);
            }

            admin.createTable(td);
            System.out.println(tableName + "表创建成功!");
        }
    }

    /**
     * 操作表
     *
     * @param connection 连接对象
     * @param tableName  表名
     * @throws IOException
     */
    public static void execTable(Connection connection, String tableName) throws IOException {
        TableName tn = TableName.valueOf(tableName);
        Table table = connection.getTable(tn);

        //查询数据
        String rowkey = "1001";
        Get get = new Get(Bytes.toBytes(rowkey));
        Result result = table.get(get);
        boolean empty = result.isEmpty();
        System.out.println(tableName + "表中是否存在该条数据:" + !empty);

        if (empty) {
            //插入数据
            Put put = new Put(Bytes.toBytes(rowkey));

            String family = "info";
            String column = "name";
            String value = "fq";

            put.addColumn(Bytes.toBytes(family), Bytes.toBytes(column), Bytes.toBytes(value));

            table.put(put);
            System.out.println("插入数据成功!");
        } else {
            //展示数据
            for (Cell cell :
                    result.rawCells()) {
                System.out.println("family = " + Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("rowkey = " + Bytes.toString(CellUtil.cloneRow(cell)));
                System.out.println("value = " + Bytes.toString(CellUtil.cloneValue(cell)));
                System.out.println("column = " + Bytes.toString(CellUtil.cloneQualifier(cell)));
            }
        }

    }

    /**
     * 删除表
     *
     * @param tableName 表名
     * @param admin     操作对象
     * @throws IOException
     */
    public static void delTable(String tableName, Admin admin) throws IOException {
        TableName tn = TableName.valueOf(tableName);

        if (admin.tableExists(tn)) {
            //禁用表
            admin.disableTable(tn);

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

    /**
     * 删除表数据
     *
     * @param tableName  表名
     * @param connection 连接对象
     * @throws IOException
     */
    public static void delData(String tableName, Connection connection) throws IOException {
        TableName tn = TableName.valueOf(tableName);

        Table table = connection.getTable(tn);

        String rowkey = "1001";
        Delete delete = new Delete(Bytes.toBytes(rowkey));
        table.delete(delete);
    }

    public static void main(String[] args) throws IOException {

        //1、创建配置对象,获取HBase连接
        Configuration conf = HBaseConfiguration.create();

        //2、获取HBase连接对象
        Connection conn = ConnectionFactory.createConnection(conf);
//        System.out.println(conn);

        //3、获取操作对象
        Admin admin = conn.getAdmin();

        //4、操作数据库
        //4.0 定义一些变量
        String namespace = "xzw";
        String tableName = "people";
        String columnFamily1 = "info";

        //4.1 判断命名空间是否存在,不存在的话创建命名空间
        isNamespaceExist(namespace, admin);

        //4.2 判断HBase中是否存在某张表
        boolean b = isTableExist(namespace + ":" + tableName, admin);
        System.out.println("HBase中是否存在" + namespace + ":" + tableName + "表:" + b);

        //4.3 创建表
        createTable(namespace + ":" + tableName, admin, columnFamily1);

        //4.4 操作表
        execTable(conn, namespace + ":" + tableName);

        //4.5 删除表
        delTable(namespace + ":" + tableName, admin);

        //4.6 删除表数据
        delData(namespace + ":" + tableName, conn);

    }

}

 

以上就是本文的所有内容,比较简单。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题~

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

象在舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值