从零开始学习HBase - 一文详解HBase常用API

2023-05-16

HBase常用API总结


❤️ 使用的HBase版本为 1.31

1. pom.xml文件:

 <!-- 配置 Hbase 的依赖 -->
    <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>

        <!-- 配置hadoop的依赖-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.5</version>
        </dependency>
    </dependencies>

2.HBUtils

package com.wangt.hbase.utils;

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

import java.io.IOException;

/**
 * @author 王天赐
 * @create 2019-08-01 19:59
 */
public class HBUtils {

    // 配置文件对象
    private static Configuration conf = null;
    // HBase 连接对象
    private static Connection connection = null;
    // 用于管理HBase 表 .命名空间的对象
    private static HBaseAdmin admin = null;

    /**
     * 获取 HBase Configuration 对象
     *
     * @return
     */
    public static Configuration getHBaseConfiguration() {
        // 创建 HBase 配置文件对象
        conf = HBaseConfiguration.create();
        // 设置 Hbase 依赖的 Zookeeper ip 以及端口
        conf.set("hbase.zookeeper.quorum", "222.22.91.81");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        return conf;
    }

    /**
     * 获取 HBase 连接对象
     *
     * @return HBase 连接对象
     */
    public static Connection getConnection() {
        // 获取 HBase Configuration 对象
        conf = getHBaseConfiguration();
        try {
            // 获取 HBase 连接对象
            connection = ConnectionFactory.createConnection(conf);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 释放 Connection 和 HBaseAdmin 连接
     *
     * @param connection Connection 对象
     * @param admin      HBaseAdmin 对象
     */
    public static void release(Connection connection, Admin admin) {

        // 关闭 HBaseAdmin 对象
        if (admin != null) {
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 关闭 HBase 连接
        if (connection != null) {
            try {
                connection.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 将数据封装进 Put 对象中
     *
     * @param rowKey rowKey的值
     * @param cf     列族名
     * @param cn     列名
     * @param value  列名对应的参数
     * @return 封装后的 Put 对象
     */
    public static Put EncapsulationDataToPutObject(String rowKey, String cf, String cn, String value) {
        // 创建 Put 对象
        Put put = new Put(Bytes.toBytes(rowKey));
        // 添加数据
        put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
        // 返回 put 对象
        return put;
    }
}


1.查看表是否存在

package com.wangt.hbase.common;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;

import java.io.IOException;

/**
 * 判断表是否存在
 * @author 王天赐
 * @create 2019-08-01 15:10
 */
public class TableExist {

    // 声明 Hbase 配置文件对象
    private static Configuration conf  = null;

    // 创建 Configuration 对象 并设置 连接zookeeper参数
    static {
        // 使用 HBaseConfiguration 的单例方法实例化
        conf = HBaseConfiguration.create();
        // 设置 HBase依赖的 zookeeper ip
        conf.set("hbase.zookeeper.quorum", "222.22.91.81");
        // 设置 zookeeper 端口
        conf.set("hbase.zookeeper.property.clientPort", "2181");
    }

    /**
     * 获取 HBaseConfiguration 对象
     * @return  HBaseConfiguration 对象
     */
    public static Configuration getHBaseConfiguration(){
        return conf;
    }

    /**
     * 获取 HBaseAdmin 对象
     * @return HBaseAdmin 对象
     * @Excepation IOException
     */
    public static HBaseAdmin getHBaseAdmin() throws IOException {

        // 在 Hbase 中 管理 访问表 需要先创建 HBaseAdmin 表
        // 1.获取 配置文件对象
        Configuration conf = getHBaseConfiguration();
        // 2.创建 连接对象
        Connection connection = ConnectionFactory.createConnection(conf);
        // 3.使用 Connection 对象创建 HBaseAdmin
        HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();

        return  admin;
    }

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

        String tableName = "dog";
        HBaseAdmin admin = getHBaseAdmin();
        // 获取所有的表的信息
        TableName[] tableNames = admin.listTableNames();
        // 打印所有表名
        for (TableName name : tableNames) {
            System.out.println(name.getNameAsString());
        }
        // 判断某个表是否存在
        System.out.println("dog 表是否存在 " + (admin.tableExists("dog") ? "存在" : "不存在"));

        if(admin.tableExists("Person")){
            System.out.println("Person 表存在");
        }else{
            System.out.println("Person 表不存在");
        }
    }

}

2.创建表

package com.wangt.hbase.common;

import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
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.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;

import java.io.IOException;

/**
 * @author 王天赐
 * @create 2019-08-01 16:09
 */
public class CreateTable {

    public static void main(String[] args) throws IOException {
        // 1.获取 Hbase 连接对象
        Connection connection = HBUtils.getConnection();
        // 2.获取 HBaseAdmin 对象用于管理和访问表
        Admin admin = connection.getAdmin();
        // 3.判断 要创建的表是否存在 (新API)
        boolean isExist = admin.tableExists(TableName.valueOf("Person"));
        //3.如果表不存在 则创建表
        if(!isExist){
            // 3.1 创建表属性对象 直接传入 String 类型的 table name 的方法已经过时
            HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("Person"));
            // 3.2 创建多个列族
            // 1.创建列族名数组
            String[] columnFamily = new String[]{"info01" , "info02"};
            // 2.向表属性对象中添加列族
            for (String cf : columnFamily) {
                // 1.创建列描述对象
                HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
                // 2.将列描述对象添加到表属性描述对象中
                descriptor.addFamily(hColumnDescriptor);
            }
            // 4.根据对表的配置创建表
            admin.createTable(descriptor);
            System.out.println("表 Person 创建成功");

        }

        // 释放链接
        HBUtils.release(connection, admin);
    }
}

3.删除表

package com.wangt.hbase.common;

import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;

import java.io.IOException;

/**
 * 测试 删除表的操作
 * @author 王天赐
 * @create 2019-08-02 10:01
 */
public class DeleteTable {

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

        // 创建 Admin 对象
        Connection connection = HBUtils.getConnection();
        Admin admin = connection.getAdmin();

        TableName deleteTable = TableName.valueOf("person");
        // 判断 表是否存在
        boolean isExist = admin.tableExists(deleteTable);
        // 如果 表存在则删除
        if (isExist){
            // 将表标记为删除状态
            admin.disableTable(deleteTable);
            // 删除表
            admin.deleteTable(deleteTable);
            System.out.println("表已删除");
        }else {
            System.out.println("表不存在 , 无法删除");
        }

    }
}

4.添加数据

package com.wangt.hbase.common;

import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * 添加表数据
 * @author 王天赐
 * @create 2019-08-02 10:21
 */
public class PutTableData {

    public static void main(String[] args) throws IOException {
        // 1.获取 Hbase 连接对象
        Connection connection = HBUtils.getConnection();
        // 过时 API
        // HTable personTable = new HTable(connection.getConfiguration(), TableName.valueOf("Person"));
        // 2.获取 Table 对象
        Table personTable = connection.getTable(TableName.valueOf("Person"));
        // 3.创建 Put 对象 添加的数据是 封装在 put 对象中的
        Put put = new Put(Bytes.toBytes("1001"));
        // 4.添加数据 对应格式 => 列族 , 列名 , 值
        put.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("name"), Bytes.toBytes("李白"));
        put.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("age"), Bytes.toBytes("19"));
        put.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("sex"), Bytes.toBytes("男"));
        // 5.添加数据
        personTable.put(put);
        System.out.println("添加成功");
        // 6.释放连接
        HBUtils.release(connection, null);

    }
}

5.批量添加数据

package com.wangt.hbase.common;

import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 批量添加表数据
 *
 * @author 王天赐
 * @create 2019-08-02 10:21
 */
public class PutMultipleTableData {

    /**
     * 将数据封装进 Put 对象中
     *
     * @param rowKey rowKey的值
     * @param cf     列族名
     * @param cn     列名
     * @param value  列名对应的参数
     * @return 封装后的 Put 对象
     */
    public static Put EncapsulationDataToPutObject(String rowKey, String cf, String cn, String value) {
        // 创建 Put 对象
        Put put = new Put(Bytes.toBytes(rowKey));
        // 添加数据
        put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
        // 返回 put 对象
        return put;
    }

    public static void main(String[] args) throws IOException {
        // 获取 Hbase 连接对象
        Connection connection = HBUtils.getConnection();
        // 获取 Table 对象
        Table personTable = connection.getTable(TableName.valueOf("Person"));
        // 用于存放封装成 Put 对象的list集合
        List<Put> puts = new ArrayList<>();

        for (int i = 1000 ; i <= 1040 ; i++){
            if(puts.size() >= 10){
                // 当数据达到10条的时候 将数据写入表中
                personTable.put(puts);
                // 清空集合
                puts.clear();
            }
            // 将数据封装成 put 对象
            Put put = EncapsulationDataToPutObject(i + "", "info01", "name", "maomao No." + i);
            // 添加进 put 集合
            puts.add(put);
        }

        // 释放连接
        HBUtils.release(connection, null);

    }
}

6.删除数据

package com.wangt.hbase.common;

import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * 删除数据
 * @author 王天赐
 * @create 2019-08-02 11:08
 */
public class DeleteTableData {


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

        // 获取 数据库连接
        Connection connection = HBUtils.getConnection();
        // 获取 Table 对象
        Table personTable = connection.getTable(TableName.valueOf("Person"));
        // deleteAll 删除一个 rowkey中所有的数据
        // 封装 Delete 对象
        Delete delete = new Delete(Bytes.toBytes("1001"));
        // 注意 : 使用addColumn添加信息删除数据的时候 只会删除最新版本的数据 ! 哪怕数据只有一个 版本 也会删除新的版本的数据 ,
        // 数据会退回到上一个版本的数据 一般使用 addColumns 可以把所有版本的数据全部删除
        // 当然也可以使用 addColumn
        //delete.addColumn(, , );
        delete.addColumns(Bytes.toBytes("info01"), Bytes.toBytes("name"));
        // 删除数据
        personTable.delete(delete);
        System.out.println("删除成功....");

        // 删除 指定 Rowkey的全部数据
        Delete delete01 = new Delete(Bytes.toBytes("1000"));
        // 删除不存在的数据 不会报错
        personTable.delete(delete01);


        System.out.println("删除成功...");

        // 释放连接
        HBUtils.release(connection, null);

    }
}

⭐️特别注意 :

  1. addColumn : 使用addColumn添加信息删除数据的时候 只会删除最新版本的数据 ! 哪怕数据只有一个 版本 也会删除新的版本的数据 ,数据会退回到上一个版本的数据 一般使用 addColumns 可以把所有版本的数据全部删除 一般需要删除指定版本的时候 可以使用这个 , 一般删除都使用 addClumns

7.扫描全表数据

package com.wangt.hbase.common;

import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * 全表扫描数据
 * @author 王天赐
 * @create 2019-08-02 16:14
 */
public class ScanData {

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

        // 获取 Hbase 连接对象
        Connection connection = HBUtils.getConnection();
        // 获取 表对象
        Table table = connection.getTable(TableName.valueOf("Person"));
        // 构建扫描对象
        Scan scan = new Scan();
        ResultScanner results = table.getScanner(scan);
        // 遍历扫描结果对象
        for (Result result : results) {
            // 获取单元格数组
            Cell[] cells = result.rawCells();
            // 从单元格数组中遍历得到数据
            for (Cell cell : cells) {
                // 一般使用 CellUtils 获取数据
                // 获取 rowKey
                String rowKey = Bytes.toString(CellUtil.cloneRow(cell));
                // 获取 列族
                String cf = Bytes.toString(CellUtil.cloneFamily(cell));
                // 获取 列名
                String cn = Bytes.toString(CellUtil.cloneQualifier(cell));
                // 获取 对应列的值
                String value = Bytes.toString(CellUtil.cloneValue(cell));
                System.out.println(
                      "[" +  rowKey + "," + cf + "," + cn + "," + value + "]"
                );
            }
        }
        // 释放链接
        HBUtils.release( connection,null);
    }
}

8.获取指定列数据

package com.wangt.hbase.common;

import com.wangt.hbase.utils.HBUtils;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * 获取 单行数据
 * @author 王天赐
 * @create 2019-08-02 16:47
 */
public class GetRowData {

    public static void main(String[] args) throws IOException {
        // 获取 Hbase 连接对象
        Connection connection = HBUtils.getConnection();
        // 获取 表对象
        Table table = connection.getTable(TableName.valueOf("Person"));

        // 构建 Get 对象 封装要获取的行的信息
        Get get = new Get(Bytes.toBytes("1006"));
        // 设置 指定的列族 和 列名
        //get.addColumn(Bytes.toBytes("info01"), Bytes.toBytes("name"));
        Result result = table.get(get);
        Cell[] cells = result.rawCells();

        // 遍历数据
        // 从单元格数组中遍历得到数据
        for (Cell cell : cells) {
            // 一般使用 CellUtils 获取数据
            // 获取 rowKey
            String rowKey = Bytes.toString(CellUtil.cloneRow(cell));
            // 获取 列族
            String cf = Bytes.toString(CellUtil.cloneFamily(cell));
            // 获取 列名
            String cn = Bytes.toString(CellUtil.cloneQualifier(cell));
            // 获取 对应列的值
            String value = Bytes.toString(CellUtil.cloneValue(cell));
            System.out.println(
                    "[" +  rowKey + "," + cf + "," + cn + "," + value + "]"
            );
        }

        table.close();
        // 释放链接
        HBUtils.release( connection,null);
    }
}


更新中… 😄

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零开始学习HBase - 一文详解HBase常用API 的相关文章

  • Twitch API - 无法使用 PHP 获取身份验证令牌

    stackoverflow 的成员们大家好 我不是一个喜欢寻求帮助的人 但在这种情况下 我认为这是解决我的问题的唯一方法 谷歌并没有给我太大帮助 所以 我的问题 我想使用 Twitch API 获取一些数据 听起来很容易 我希望是这样 下面
  • 创建rest api url以连接mysql数据库

    我想学习如何创建一个rest api url 以便我可以使用该url获取信息并将信息发布到我的mysql数据库中 谷歌搜索了很多并阅读了各种文章 但没有找到任何精确的内容可以学习 所有内容均以 about api 开头 以已创建的其余 ur
  • 我们如何查询Kibana?

    我们如何使用 REST API 请求 Kibana 来获取可视化请求 和回应 Like this 我想使用 NodeJS 来操作 Kibana 的结果 目的是我想以编程方式 通过 REST API 直接查询 Kibana 以获取 ES 请求
  • C++ API 设计和错误处理

    我需要使用 lib 文件 MSVC 编写 C API 它由 Dll 公开的几个导出的 C 类组成 从我的另一个问题的答案中我了解到 如果 C API 是在一个 VC 版本 假设是 2010 中构建的 并且客户端代码是在另一个 VC 版本中编
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • 收到“提供的 API 密钥已过期”。使用 Places API 时出错

    我已经从 Google 控制台为 Places API 密钥生成了服务器密钥 但每当我访问该服务时 我都会收到 提供的 API 密钥已过期 错误 我已尝试重新生成密钥 但仍然出现相同的错误 我遇到了同样的问题 但终于解决了 Google 地
  • Skype API 的实现[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的 Skype 插件 https stackoverflow com questions 1149615 skype addon in c sharp 如何在 C 中实现 Skype API 来
  • 如何用java制作字典? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试用java制作一个离线词典
  • 有没有 API 可以在两个 iphone/ipod Touch/ipad 之间共享数据? (GameKit 除外)[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有任何框架 API可以轻松找到其他设备并在它们之间共享数据 请不是游戏包 bonjour 会很棒
  • net.Socket.writable、net.Socket.readable 属性不是官方 Node.js API 的一部分

    我想知道为什么 net Socket writable 和 net Socket read 属性不是官方 Node js API 的一部分 这是否意味着最好不要使用这些属性 因为它是将来可能会改变的内部内容 它们是 但不是你正在寻找的地方
  • 我们如何在 python 中使用 ms office communicator 客户端公开的 API,这可能吗?

    我想使用 ms office communicator 客户端 api 并且我想在 python 中使用这些 API 可以吗 gt gt gt import win32com client gt gt gt msg win32com cli
  • twig json_encode 空 json

    我正在从 API 接收元素列表 所有元素的格式都很好 当我使用树枝转储其中一个时 我得到以下信息 Leg 2695 id null reservation null airportStart AIX LES MILLES airplaneT
  • Magento SOAP V2 API - 附加属性设置为空

    几个小时以来 我一直在尝试通过 SOAP V2 API 创建具有附加属性的产品 每当我打电话时就会添加该产品目录产品创建但我随请求发送的附加属性被设置为空 每当我不添加附加属性时 这两个属性都会设置为其默认值 因此我认为这些属性正在发送和接
  • 如何使用 Azure DevOps 的 python 客户端 API 将用户添加到 Azure DevOps?

    我正在编写一个 python 脚本来将用户 来自 AAD 支持的提供商的现有用户 添加到 Azure DevOps 我正在使用 Azure DevOps 的 python 客户端库来实现此目的 身份验证后 我可以从 azure devops
  • 使用curl登录并获取会话

    你好 我需要以某种方式获得最高区域的兴趣和随着时间的推移的兴趣 或更好 所以我发现我们必须登录才能导出数据有人可以给我一个使用我们的谷歌用户名和密码执行此操作的示例吗 也许使用curl来导出数据 或者是其他东西 感谢您的关注 亚当 拉马丹
  • 如何从 API 转换一些原始数据并将其保存到变量中,以便我可以在 C# 中使用它们

    我正在做一个个人项目 它是一个 C 应用程序 使用 API 与一些 Web 服务进行通信 我终于用这几行得到了第一个原始数据 var client new RestClient https api abcd com token var re
  • 如何使用hbase协处理器实现groupby?

    最近学习了hbase协处理器 我使用endpoint来累加hbase表的一列 例如 名为 pendings 的hbase表 它的家族是 asset 我累加了 asset amount 的所有值 该表还有其他列 例如 asset custom
  • 在 HBase 中存储和检索字符串数组

    我读过这个答案 如何将复杂对象存储到hadoop Hbase中 https stackoverflow com questions 4086684 how to store complex objects into hadoop hbase
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • 有没有办法通过API调用访问私有数据集

    我正在使用 CKAN 2 8 运行 Mirth 3 6 1 作为新手 我遇到了一个问题 有没有办法通过 API 请求访问 CKAN 中私有数据集中的资源 我好像做不到 我有一个拥有公共数据集的组织 我可以通过 API 路由器通过 Mirth

随机推荐