从零开始学习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 的相关文章

  • 如果 HBase 不是运行在分布式环境中,它还有意义吗?

    我正在构建数据索引 这将需要以形式存储大量三元组 document term weight 我将存储多达几百万个这样的行 目前我正在 MySQL 中将其作为一个简单的表来执行 我将文档和术语标识符存储为字符串值 而不是其他表的外键 我正在重
  • 如何将 YouTube API 集成到我的 iPhone 应用程序中?

    我想将 YouTube API 集成到我的应用程序中 我该怎么做 附注 我正在为 YouTube 频道制作一个应用程序 我尝试以webview 但这让一切变得更糟 因为用户可以看到 YouTube 控件 搜索等 以及有关 YouTube i
  • 如何按城市过滤 WikiVoyage API 结果?

    我目前正在尝试使用 wikivoyage API 我当前的 API 调用如下所示 en wikivoyage org w api php action query list search srwhat text srsearch Pari
  • C++标准API

    我是一名学生 也是 C 新手 我正在寻找与 Java API 一样全面的标准 C API 到目前为止我一直在使用cplusplus com http www cplusplus com and cppreference com https
  • 使用 Bloomberg .Net API 的每小时数据

    我正在努力解决使用 Net API 3 0 从 Bloomberg 获取每小时开盘价 最高价 最低价和最后价格快照的逻辑 我已经用谷歌搜索了很多次 但没有运气 对此的任何帮助将不胜感激 我试图在 Bloomberg Net API C 中找
  • jQuery - 解析 JSON 数据 - 变量名称遇到问题

    我第一次深入研究 JSON 数据的使用 不过我有一些使用 jQuery 的经验 我发布到此 URL tumblr api jyoseph com api read json 我想做的是输出返回的 json 到目前为止我所拥有的 docume
  • 授予 Rails 应用 API 访问权限的最佳身份验证方法

    我想为我的网络应用程序提供经过身份验证的 API 访问 此类服务的消费者通常是其他网站 服务 验证这些用户身份的最佳方法是什么 OAuth openID http 身份验证 正如我们的工作一样 哪个最好 的答案是这样的 是 这取决于 HTT
  • Magento 2 REST API 客户自定义属性

    Magento 2 REST API 文档解释了在更新或创建客户时设置custom attributes 的方法 http devdocs magento com swagger index 20 html http devdocs mag
  • 从我自己的博客获取帖子[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何 API 通过它我可以从 wordpress com 上我自己的博客获取帖子并将它们放在我的
  • 简单的跨平台 TCP IP API?

    我不打算使用像 QT 或 wxWidgets 的 API 这样的大东西 我只想要可以在 Android iOS Windows Mac Linux 上运行的简单套接字 我正在制作一个事件驱动的纸牌游戏 所以 TCP 是最好的 本质上 我只想
  • 使用 C#.net 中的私有存储库的身份验证读取 BitBucket API

    我已经尝试了几天让 BitBucket API 为我工作 但是当涉及到让它为具有身份验证的私有存储库工作时 将问题设置为私有 当它们设置为公开 无需身份验证 一切正常 代码示例如下 static void Main string args
  • 发送 Microsoft Graph 请求事件返回 400

    我能够通过将 JSON 请求发布到https graph microsoft com v1 0 me calendar events https graph microsoft com v1 0 me calendar events 我已经
  • 如何在 Google Maps API 中指示语言?

    就像你访问一样maps google com tw or maps google co kr or maps google co jp 您可以看到每个国家 地区都显示自己的语言 我可以在 Google 地图 API 中使用任何属性来动态设置
  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • Codeception API 测试响应返回“N/A”

    我正在使用 Laravel 和 Codeception 作为测试框架编写 API 我无法让 Codeception 返回响应代码 我可以从 Codeception 获取响应代码 以及 JSON 响应 我编写了一个简单的测试来从 GET 请求
  • XML-RPC 与 REST

    我打算在这里构建一个小型服务器 并想为其创建一个 API 我正在决定什么是更好的并且已经排除了SOAP因为在我看来那件事是一团糟 我只剩下REST and XML RPC 我真的很喜欢XML RPC 它实现起来非常简单 并且足够常规 所有客
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • 无法在 Angular 10 中的“pdf-viewer”=>“ng2-pdf-viewer”中显示 blob url

    我有一个 API 它将上传的文件作为 blob 返回 当我尝试绑定时src如果使用 blob URL 则它不会显示任何内容 但是 当我尝试绑定直接 URL 时 它可以显示 PDF 文件 这是我下面给出的代码 我的 TS 代码 downloa
  • Twitter 的推文按钮有回调吗?

    有没有办法在 Twitter 的推文按钮上注册回调 我希望能够跟踪我网站上的哪些特定用户在 Twitter 上发布了链接 我无法添加 onClick 事件 因为它是跨域 iFrame 还有其他想法吗 我见过一种方法 https stacko
  • 如何在 Django Rest 框架中编写“删除”操作的测试

    我正在为 Django Rest Framework API 编写测试 我一直在测试 删除 我对 创建 的测试工作正常 这是我的测试代码 import json from django urls import reverse from re

随机推荐