Hbase的简单使用示例

news2024/9/17 7:13:40

HBase 是基于 Hadoop HDFS 构建的分布式、列式存储的 NoSQL 数据库,适用于存储和检索超大规模的非结构化数据。它支持随机读写,并且能够处理 PB 级数据。HBase 通常用于实时数据存取场景,与 Hadoop 生态紧密集成。

使用 HBase 的 Java 示例

前置条件
  1. HBase 集群:确保 HBase 集群已经安装并启动。如果没有,你可以通过本地伪分布模式或 Docker 来运行 HBase。
  2. Hadoop 配置:HBase 通常与 Hadoop HDFS 集成,确保正确配置 Hadoop 和 HBase。
  3. 依赖:项目中需要添加 HBase 和 Hadoop 的依赖,下面是 Maven 项目中的依赖配置。
Maven 依赖
<dependencies>
    <!-- HBase Client -->
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>2.4.8</version>
    </dependency>

    <!-- Hadoop Common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.2.2</version>
    </dependency>
</dependencies>

HBase 示例代码

以下是一个简单的 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;

public class HBaseExample {

    // HBase 配置
    private static Configuration config;
    private static Connection connection;
    private static Admin admin;

    public static void main(String[] args) throws IOException {
        // 初始化 HBase 配置
        config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.quorum", "{ZOOKEEPER_HOST}"); // 设置 ZooKeeper 地址
        config.set("hbase.zookeeper.property.clientPort", "2181"); // 设置 ZooKeeper 端口

        // 获取 HBase 连接
        connection = ConnectionFactory.createConnection(config);
        admin = connection.getAdmin();

        // 表名与列族名
        TableName tableName = TableName.valueOf("test_table");
        String columnFamily = "cf";

        // 1. 创建表
        createTable(tableName, columnFamily);

        // 2. 插入数据
        insertData(tableName, columnFamily, "row1", "name", "Alice");
        insertData(tableName, columnFamily, "row1", "age", "30");

        // 3. 获取数据
        getData(tableName, columnFamily, "row1", "name");
        getData(tableName, columnFamily, "row1", "age");

        // 4. 删除表
        deleteTable(tableName);

        // 关闭资源
        connection.close();
    }

    // 创建表
    private static void createTable(TableName tableName, String columnFamily) throws IOException {
        if (admin.tableExists(tableName)) {
            System.out.println("Table already exists.");
        } else {
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());

            admin.createTable(tableDescriptorBuilder.build());
            System.out.println("Table " + tableName + " created.");
        }
    }

    // 插入数据
    private static void insertData(TableName tableName, String columnFamily, String rowKey, String qualifier, String value) throws IOException {
        Table table = connection.getTable(tableName);
        Put put = new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier), Bytes.toBytes(value));
        table.put(put);
        System.out.println("Inserted data: " + rowKey + " => " + qualifier + ": " + value);
        table.close();
    }

    // 获取数据
    private static void getData(TableName tableName, String columnFamily, String rowKey, String qualifier) throws IOException {
        Table table = connection.getTable(tableName);
        Get get = new Get(Bytes.toBytes(rowKey));
        get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
        Result result = table.get(get);

        byte[] value = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
        if (value != null) {
            System.out.println("Retrieved data: " + rowKey + " => " + qualifier + ": " + Bytes.toString(value));
        } else {
            System.out.println("No data found for row: " + rowKey);
        }
        table.close();
    }

    // 删除表
    private static void deleteTable(TableName tableName) throws IOException {
        if (admin.tableExists(tableName)) {
            admin.disableTable(tableName);
            admin.deleteTable(tableName);
            System.out.println("Table " + tableName + " deleted.");
        } else {
            System.out.println("Table " + tableName + " does not exist.");
        }
    }
}

代码说明

  1. HBase 配置

    • config.set("hbase.zookeeper.quorum", "{ZOOKEEPER_HOST}"):这里的 {ZOOKEEPER_HOST} 是你 ZooKeeper 服务的主机名或 IP 地址。ZooKeeper 是 HBase 的分布式协调服务,用于管理集群状态。
  2. 表操作

    • 使用 Admin 对象创建和删除表。在创建表时,使用 TableDescriptorBuilderColumnFamilyDescriptorBuilder 定义表和列族。
  3. 插入数据

    • 使用 Put 对象插入数据到指定的行键、列族和列限定符。
  4. 获取数据

    • 使用 Get 对象根据行键和列限定符获取数据。
  5. 删除表

    • 使用 admin.disableTable()admin.deleteTable() 来删除表。

输出结果

运行程序后,你可以看到以下输出(假设表不存在):

Table test_table created.
Inserted data: row1 => name: Alice
Inserted data: row1 => age: 30
Retrieved data: row1 => name: Alice
Retrieved data: row1 => age: 30
Table test_table deleted.

总结

这个简单的 HBase 案例演示了如何在 Java 应用中使用 HBase 进行表的创建、数据插入、数据检索和表的删除操作。HBase 适合存储大规模、稀疏的非结构化数据,能够很好地支持实时读写操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Data Filtering Network论文浅析

time2023-09paperhttps://arxiv.org/abs/2309.17425codehttps://huggingface.co/apple/DFN5B-CLIP-ViT-H-14-378org.Apple个人博客地址http://myhz0606.com/article/dfn Motivation 训练一个好的CLIP模型依赖大规模&#xff0c;高质量的训练数据。通过爬虫&#xff0c;可以很…

S7-1200与G120变频器CU240E-2控制单元通过353报文实现PN通信的基本方法

S7-1200与G120变频器CU240E-2控制单元通过353报文实现PN通信的基本方法 西门子报文353 PKW+PZD-2/2, 6个字中前4个字是PKW用,后2个字是PZD用, 结合以上内容, 可以知道第5个字是STW1控制字,第6个字是转速给定值(PLC输出);第5个字是ZSW1是状态字,第6个字是当前转速值(P…

LeetCode:快乐数(202)

目录 题目 代码思路 双指针 代码实现 题目 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 编写一个算法来判断一个数 n 是不是快乐数。 [ 快乐数 ] 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程…

ThinkPHP5 5.0.23-rce远程代码执行漏洞复现

漏洞描述 ThinkPHP是一款运用极广的PHP开发框架。其版本5中&#xff0c;由于框架对控制器名没有进行足够的检测&#xff0c;会导致在没有开启强制路由的情况下可执行任意方法&#xff0c;从而导致远程命令执行漏洞。 启动容器 docker-compose up -d 查看端口 docker ps 端口为…

【C++进阶】hash表的封装

文章目录 hash表哈希表的关键组成部分哈希表的优缺点优点&#xff1a;缺点&#xff1a; 常见应用场景 开放定址法实现hash表负载因子 (Load Factor)负载因子的意义负载因子的影响再散列 (Rehashing)示例 整体框架insertFinderasehash桶封装框架insertfinderase~HashTable() 总结…

从路径优化学习FastPlanner之B样条曲线平滑(二):FastPlanner中B样条曲线代码理解与解读

参考别人的博客学习 根据之前一章只是大致了解了B样条数学原理&#xff0c;实际读代码还有疑惑。 控制点是什么&#xff1f;和规划出的路径点什么关系&#xff1f; 控制点可以说我们规划出的路径点&#xff0c;即n等于轨迹点个数。也可以不是轨迹点&#xff0c;通过线性方程反解…

Einsum(Einstein summation convention)

Einsum&#xff08;Einstein summation convention&#xff09; 笔记来源&#xff1a; Permute和Reshape嫌麻烦&#xff1f;einsum来帮忙&#xff01; The Einstein summation convention is a notational shorthand used in tensor calculus, particularly in the fields of …

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议&#xff0c;有时候说的内容比较广需要引用多份的数据&#xff0c;我记录起来有一定难度&#xff0c;所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链…

9.7(QT.Day 1)

一、自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 要求&#xff1a;每行代码都有注释 【需要用到的图片或者动图&#xff0c;自己去网上找】 1.mywidget.h代码 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QIcon> //图…

C++之格式化日期时间为字符串(精确到毫秒)

C11中提供了获取时间的chrono库&#xff0c;但是格式化显示太方便&#xff1b;C11还提供了格式化时间iomanip库&#xff0c;通过其put_time方法可以格式化时间到秒&#xff0c;要显示毫秒&#xff0c;就需要自己处理了。 #include <chrono> #include <string> #in…

css flex与inline-flex的区别

1、flex与inline-flex布局&#xff0c;都是弹性布局&#xff0c;盒状容器布局。 Flex 布局是什么&#xff1f;_w3cschool 2、下面一个实例来说明一下&#xff1a; 有一个要求&#xff0c;要求item增多的时候&#xff0c;不会换行&#xff0c;并且container容器也会随时item的…

【机器学习】我小学二年级妹妹都能理解的线性回归算法

什么是线性回归&#xff1f; 我小学二年级的妹妹想用压岁钱买房子&#xff0c;售楼广告上写着100万可以买100的房子&#xff0c;200万可以买200的房子&#xff0c;但是我的妹妹觉得那些房子都太小了&#xff0c;想买300的房子&#xff0c;那她应该要花多少钱呢&#xff1f; 对…

DBMS-2.2 数据库设计(2)——数据库规范化设计理论

本文章的素材与知识来自李国良老师和冠宇老师。 依赖理论 对于关系数据库中的依赖&#xff0c;分为函数依赖、多值依赖和连接依赖。 一.函数依赖 1.函数依赖 &#xff08;1&#xff09;定义&#xff1a; &#xff08;2&#xff09;理解&#xff1a; 通俗地讲&#xff0c;…

【Linux】借命令行参数的引导,探索环境变量的奥秘

目录 1.命令行参数 1.1.概念&#xff1a; 1.2.利用命令行参数打造计算器&#xff1a; 2.环境变量 2.1.环境变量是什么&#xff1f; 2.2.有什么方法可以不用带路径&#xff0c;直接就可以运行自己的程序呢&#xff1f; 法一&#xff1a; 法二&#xff1a; 2.3.通过代码…

PostgreSQL技术内幕9:PostgreSQL事务原理解析

文章目录 0.简介1.PG事务整体介绍1.1 事务类型介绍 1.2 事务模块介绍2. 代码分析 0.简介 有了上一篇数据库事务并发控制协议的介绍&#xff0c;对于数据库事务和并发控制有了基本的认识&#xff0c;本文将介绍PG事务模块&#xff0c;主要介绍PG支持的事务类型&#xff08;普通…

git为不同的项目设置不同的提交作者

方法1&#xff1a;找到项目的.git文件夹打开 打开config在下面添加自己作者信息 [user]name 作者名email 邮箱方法2&#xff1a;直接在.git文件夹设置作者名&#xff08;不使用–global参数&#xff09; git config user.name "xxxxx"如果想要修改之前提交的…

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

vllm源码解析(五):LLM模型推理

八 模型推理细节探索 8.1 回顾下step的流程 def step(self) -> List[Union[RequestOutput, EmbeddingRequestOutput]]:# 多GPU并行推理时走AsyncLLMEngine分支。如果进入当前LLMEngine,性能会下降&#xff0c;这里会抛出异常。if self.parallel_config.pipeline_parallel_s…

基于机器学习的电商优惠券核销预测

1. 项目简介 随着移动互联网的快速发展&#xff0c;O2O&#xff08;Online to Offline&#xff09;模式已成为电商领域的一大亮点。优惠券作为一种有效的营销工具&#xff0c;被广泛应用于吸引新客户和激活老用户。然而&#xff0c;传统的随机投放方式往往效率低下&#xff0c;…

JavaWeb【day11】--(SpringBootWeb案例)

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能&#xff0c;还有两个需要实现&#xff1a; 新增员工 修改员工 首先我们先完成"新增员工"的功能开发&#xff0c;再完成"修改员工"的功能开发。而在&quo…