HBase DML操作代码汇总(表格数据的CRUD操作)

HBase DML操作

在这里插入图片描述
DML操作主要是关于对表格内部数据的增删改查。

  1. HbaseDML
package org.hbase;import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;public class HbaseDML {public static Connection connection = HBaseConnection.connection;/*** 向指定的HBase表中插入一个单元格数据。** @param namespace    命名空间,HBase中用于组织表的逻辑分组。* @param tableName    表名,HBase中的表标识。* @param rowKey       行键,用于唯一标识表中的一行。* @param columnFamily 列族名,HBase表中列的分组。* @param columnName   列名,列族下的具体列。* @param value        要插入的单元格值。* @throws IOException 如果与HBase的通信出现问题或插入数据时发生错误,将抛出此异常。*/public static void putCell(String namespace, String tableName, String rowKey,String columnFamily, String columnName, String value) throws IOException {// 获取HBase连接中的指定表Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个Put对象,用于存储要插入的行数据Put put = new Put(Bytes.toBytes(rowKey));// 向Put对象中添加列族、列名和对应的值put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName), Bytes.toBytes(value));// 尝试将Put对象写入HBase表try {table.put(put);} catch (IOException e) {// 如果发生IO异常,将其封装为RuntimeException并抛出throw new RuntimeException("Failed to put cell data to HBase table", e);}// 关闭表连接,释放资源table.close();}/*** 从HBase表中获取指定行与列的数据。** @param namespace    命名空间,用于在HBase中逻辑上组织表。* @param tableName    表名,标识HBase中的具体表。* @param rowKey       行键,唯一标识表中的一行数据。* @param columnFamily 列族名,表示HBase表中列的分组。* @param columnName   列名,在指定列族下的具体列。* @throws IOException 若与HBase通信出错或数据检索失败,则抛出此异常。*/public static void getCells(String namespace, String tableName, String rowKey,String columnFamily, String columnName) throws IOException {// 根据命名空间和表名获取HBase连接中的对应表Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个Get对象,用于指定要检索的行数据Get get = new Get(Bytes.toBytes(rowKey));// 添加要检索的列族与列名get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));// 设置读取所有版本的数据(若表启用了版本控制)// 注:检查HBase的设置,如果VERSIONS,设置为1,这意味着HBase将只保留该列族中每个单元格的最新版本。get.readAllVersions();try {// 执行Get操作,从表中检索数据,并得到Result对象Result result = table.get(get);// 从Result对象中提取原始单元格数据Cell[] cells = result.rawCells();// 遍历并处理检索到的单元格数据for (Cell cell : cells) {// 使用CellUtil工具类从单元格中提取值,并转换为字符串String value = new String(CellUtil.cloneValue(cell));// 输出单元格值(实际应用中可能进行不同处理)System.out.println(value);}} catch (Exception e) {// 打印异常堆栈信息(生产环境中应进行更细致的错误处理)e.printStackTrace();}// 确保在方法结束时关闭表连接,释放资源table.close();}/*** 扫描HBase表中的行,并打印出每行中的单元格信息。** @param namespace 命名空间,HBase中表的命名空间,通常对应于数据库的概念。* @param tableName 表名,HBase中的表名。* @param startRow  扫描的起始行键,包含此行。* @param stopRow   扫描的停止行键,不包含此行(即扫描到stopRow之前的行)。* @throws IOException 如果与HBase的通信出现问题,则抛出此异常。*/public static void scanRows(String namespace, String tableName, String startRow, String stopRow) throws IOException {// 根据命名空间和表名获取HBase表的引用Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个新的扫描对象Scan scan = new Scan();// 设置扫描的起始行键(包含)scan.withStartRow(Bytes.toBytes(startRow));// 设置扫描的停止行键(不包含)scan.withStopRow(Bytes.toBytes(stopRow));try {// 获取扫描器,用于迭代表中的行ResultScanner scanner = table.getScanner(scan);// 迭代扫描器中的每个结果(即每行数据)for (Result result : scanner) {// 获取当前行的所有单元格Cell[] cells = result.rawCells();// 迭代当前行的每个单元格,并打印其信息for (Cell cell : cells) {System.out.print(// 单元格的行键new String(CellUtil.cloneRow(cell)) + "-" +// 单元格的列族new String(CellUtil.cloneFamily(cell)) + "-" +// 单元格的列限定符(即列名)new String(CellUtil.cloneQualifier(cell)) + "-" +// 单元格的值new String(CellUtil.cloneValue(cell)) + "\t");}// 打印完当前行的所有单元格后,换行System.out.println();}// 关闭扫描器,释放资源scanner.close();} catch (IOException e) {// 如果出现IO异常,打印堆栈跟踪e.printStackTrace();}// 关闭表的引用,释放资源table.close();}/*** 根据指定的命名空间、表名、起始行、结束行、列族、列名和值对HBase表进行过滤扫描。** @param namespace    HBase表的命名空间。* @param tableName    HBase表的名称。* @param startRow     扫描的起始行键(包含)。* @param stopRow      扫描的停止行键(不包含)。* @param columnFamily 要过滤的列族名称。* @param columnName   要过滤的列名。* @param value        用于过滤的值。* @throws IOException 如果与HBase的交互发生IO异常。*/public static void filterScan(String namespace, String tableName, String startRow, String stopRow, String columnFamily, String columnName, String value) throws IOException {// 根据命名空间和表名获取HBase表的引用Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个新的扫描对象Scan scan = new Scan();// 设置扫描的起始行键(包含)scan.withStartRow(Bytes.toBytes(startRow)); // 将字符串转换为字节数组// 设置扫描的停止行键(不包含)scan.withStopRow(Bytes.toBytes(stopRow)); // 将字符串转换为字节数组// 创建过滤器列表,可以添加多个过滤器FilterList filterList = new FilterList();// 创建过滤器:结果只保留当前列的数据,且列的值等于指定的值ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(columnFamily), // 列族名转换为字节数组Bytes.toBytes(columnName), // 列名转换为字节数组CompareOperator.EQUAL, // 比较操作符:相等Bytes.toBytes(value) // 值转换为字节数组);// 创建过滤器:结果保留整行数据,但只有当指定列的值等于指定值时才返回该行// 注意:这与ColumnValueFilter不同,它不会过滤掉没有指定列的行SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), // 列族名转换为字节数组Bytes.toBytes(columnName), // 列名转换为字节数组CompareOperator.EQUAL, // 比较操作符:相等Bytes.toBytes(value) // 值转换为字节数组);// 将此过滤器加入到过滤器列表中// 注意:这里选择了singleColumnValueFilter,根据实际需求可以选择不同的过滤器filterList.addFilter(singleColumnValueFilter);// 添加过滤到扫描中scan.setFilter(filterList);try {// 获取扫描器,用于迭代表中的行ResultScanner scanner = table.getScanner(scan);// 迭代扫描器中的每个结果(即每行数据)for (Result result : scanner) {// 获取当前行的所有单元格Cell[] cells = result.rawCells();// 迭代当前行的每个单元格,并打印其信息for (Cell cell : cells) {System.out.print(// 单元格的行键new String(CellUtil.cloneRow(cell)) + "-" +// 单元格的列族new String(CellUtil.cloneFamily(cell)) + "-" +// 单元格的列限定符(即列名)new String(CellUtil.cloneQualifier(cell)) + "-" +// 单元格的值new String(CellUtil.cloneValue(cell)) + "\t");}// 打印完当前行的所有单元格后,换行System.out.println();}// 关闭扫描器,释放资源scanner.close();} catch (IOException e) {// 如果出现IO异常,打印堆栈跟踪e.printStackTrace();} finally {// 关闭表的引用,释放资源// 使用finally块确保表关闭,即使发生异常table.close();}}/*** 删除指定HBase表中特定行和列的数据。** @param namespace    表的命名空间(相当于数据库名)* @param tableName    表的名称* @param rowKey       行的键* @param columnFamily 列族名* @param columnName   列名* @throws IOException 如果操作过程中发生IO异常*/public static void deleteColumn(String namespace, String tableName, String rowKey, String columnFamily, String columnName) throws IOException {// 根据命名空间和表名获取HBase表对象Table table = connection.getTable(TableName.valueOf(namespace, tableName));// 创建一个Delete对象,用于删除指定行的数据Delete delete = new Delete(Bytes.toBytes(rowKey));// 添加要删除的列信息(删除指定版本)// 注意:此行代码只会删除指定列的一个版本,如果没有特别指定版本号,实际上效果可能不明显delete.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));// 添加要删除的列信息(删除所有版本)// 此行代码会删除指定列的所有版本的数据delete.addColumns(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName));try {// 执行删除操作table.delete(delete);} catch (IOException e) {// 如果删除过程中发生IO异常,抛出运行时异常throw new RuntimeException("删除数据时发生IO异常", e);}// 确保在操作结束后关闭表连接,释放资源table.close();}public static void main(String[] args) throws IOException {//插入单条数据//putCell("bigdata", "student", "20240924", "info", "job", "45");//读取数据//getCells("bigdata", "student", "20240924", "info", "job");//扫描//scanRows("bigdata","student","0","20240925");//filterScan("bigdata","student","0","999999999","info","name","zz");//删除deleteColumn("bigdata", "student", "01", "info", "name");HBaseConnection.closeConnection();}}
  1. HbaseConnection
package org.hbase;import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import java.io.IOException;public class HBaseConnection {public static Connection connection =null;static {//创建连接//默认使用同步连接try {//读取本地文件connection = ConnectionFactory.createConnection();} catch (IOException e) {e.printStackTrace();}//异步连接创建//asyncConnectionCompletableFuture= ConnectionFactory.createAsyncConnection();}public static void closeConnection() throws IOException {if(connection!=null){connection.close();}}public static void main(String[] args) throws IOException {//使用连接System.out.println(HBaseConnection.connection);//关闭连接HBaseConnection.closeConnection();}
}
  1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.hbase</groupId><artifactId>Hbase01</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.17</version></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies><build><plugins><plugin><!--声明--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><!--具体配置--><configuration><archive><manifest><!--jar包的执行入口--><mainClass>org.hbase.HbaseDML</mainClass></manifest></archive><descriptorRefs><!--描述符,此处为预定义的,表示创建一个包含项目所有依赖的可执行 JAR 文件;允许自定义生成jar文件内容--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><!--执行配置--><executions><execution><!--执行配置ID,可修改--><id>make-assembly</id><!--执行的生命周期--><phase>package</phase><goals><!--执行的目标,single表示创建一个分发包--><goal>single</goal></goals></execution></executions></plugin></plugins></build></project>

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

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

相关文章

性能测试:性能测试计划

性能测试计划是在进行软件或系统的性能测试之前制定的详细计划和指导文件。它描述了所需性能测试的目标、范围、测试环境、资源需求、测试策略、测试用例、时间表等重要信息。 为什么要制定性能测试计划 制定性能测试计划的主要目的是确保性能测试的有效性和可靠性。以下是制…

通过OpenScada在ARMxy边缘计算网关上实现数字化转型

随着工业4.0概念的普及&#xff0c;数字化转型已成为制造业升级的关键路径之一。在此背景下&#xff0c;边缘计算技术因其能够有效处理大量数据、减少延迟并提高系统响应速度而受到广泛关注。ARMxy边缘计算网关&#xff0c;特别是BL340系列&#xff0c;凭借其强大的性能和灵活的…

大联大友尚集团推出基于炬芯科技产品的蓝牙音箱方案

大联大控股宣布&#xff0c;其旗下友尚推出基于炬芯科技&#xff08;Actions&#xff09;ATS2835P蓝牙音频SoC的蓝牙音箱方案。 图示1-大联大友尚基于炬芯科技产品的蓝牙音箱方案的展示板图 在智能音频设备市场持续升温的浪潮中&#xff0c;蓝牙音箱凭借音质卓越、操作简便等…

自定义认证过滤器和自定义授权过滤器

目录 通过数据库动态加载用户信息 具体实现步骤 一.创建数据库 二.编写secutity配置类 三.编写controller 四.编写服务类实现UserDetailsService接口类 五.debug springboot启动类 认证过滤器 SpringSecurity内置认证流程 自定义认证流程 第一步:自定义一个类继承Abstra…

【15%】100小时机器学习——什么是机器学习

前言 虽然已经好久没有更新了&#xff0c;但笔者最近一直都在努力学习哦。 前面三三两两根据GitHub上的项目写了一些实验操作&#xff0c;但是总觉得这样是不行的。碎片化的学习只能是建立在已知的基础上进行熟练&#xff0c;不能作为打基础的主力方法&#xff0c;最关键的是&a…

CJEval:一个基于中国初中考试的多样化考试问题数据集

2024-09-26&#xff0c;由腾讯YouTu Lab和北京大学联合发布的CJEval&#xff0c;是一个基于中国初中生考试数据的评估基准&#xff0c;用于测试和分析大型语言模型&#xff08;LLMs&#xff09;在教育任务中的表现&#xff0c;从而提高在线教育平台的智能化水平。 一、背景&…

【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构

一、html5 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><script type"text/javascript" src"http://51.onelink.ynwlzc.net/o2o/tpl/Merchant/static/js…

【CSS in Depth 2 精译_041】6.4 CSS 中的堆叠上下文与 z-index(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09;第二章 相对单位&#xff08;已完结&#xff09;第三章 文档流与盒模型&#xff08;已完结&#xff09;第四章 Flexbox 布局&#xff08;已…

养猫久了才发现,宠物空气净化器才是真正除猫毛的神器

相信每个打工人都在期待这个国庆小长假吧&#xff0c;终于等到了&#xff01;这次我要把属于我的都夺回来&#xff01;刚好工资到手、小长假我有&#xff0c;只想往家里一躺什么也不想&#xff0c;唯一最想做的就是要在这个节假日里好好的陪一下我家猫咪&#xff0c;还有就是买…

关于LlamaIndex 的存储概念和代码基本实现

概念 LlamaIndex 提供了一个高级接口&#xff0c;用于提取、索引和查询外部数据。 在后台&#xff0c;LlamaIndex 还支持可插拔的存储组件&#xff0c;允许您自定义&#xff1a; Document stores 文档存储&#xff1a;存储摄取的文档&#xff08;即对象&#xff09;的位置&a…

cscode搭建vue项目

创建前安装环境 ctrlj弹出终端 window需要管理员运行并且授权 node -v # 显示版本号&#xff0c;说明 node 已经装好 npm -v # 显示版本号&#xff0c;说明 npm 可以使用 # 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm -v # 显示版本号&a…

深度学习(三)——Springer特刊推荐

特刊征稿 01 期刊名称&#xff1a; MOBILE NETWORKS & APPLICATIONS 特刊名称&#xff1a;Resource Efficient Deep Learning for Computer Vision Applications 截止时间&#xff1a; 开放提交&#xff1a;2023年12月13日 提交截止日期&#xff1a;2024年10月30日 目标…

关于LlamaIndex 的几种索引方式介绍

每个索引的工作原理 本指南介绍每个索引如何与图表配合使用。 一些术语&#xff1a; Node&#xff1a;对应于 Document 中的一段文本。LlamaIndex 接收 Document 对象&#xff0c;并在内部将它们解析/分块为 Node 对象。Response Synthesis&#xff1a;我们的模块&#xff0…

【一文读懂】C#如何实现通用的排序功能

目录 通用排序功能 1.升序 2.降序 测试 1.测试代码 2.测试结果 本篇文章来分享一下C#如何实现通用的排序功能。在项目中经常会使用到排序的方法&#xff0c;那如何使排序方法更加通用呢&#xff1f;可以通过泛型&#xff0c;接口&#xff0c;委托来实现。 通用排序功能…

再也不用担心内容重复!在线伪原创工具,让创作更自由!

大家好&#xff0c;今天我们将讨论一个对网络写作非常有益的辅助工具——在线内容转换工具。不论您是需要更新您的博客&#xff0c;还是希望在社交平台上保持活跃&#xff0c;我们都频繁面临着迅速生成新内容的挑战。利用一个有效的工具来改写现有内容&#xff0c;可以极大地提…

机器学习笔记(李宏毅老师2021/2022课程)【更新中】

目录 前言 课程预览 第一讲 机器学习基本概念 前言 本文主要记录在听李宏毅老师的课时对应做的课堂笔记 课程&#xff1a; (强推)李宏毅2021/2022春机器学习课程_哔哩哔哩_bilibili 课程预览 机器学习找函数 &#xff08;找一个人类写不出来的复杂函数&#xff09; 课程侧…

Splashtop 自收购 Foxpass 以来新业务增长62%

2024年9月24日 加利福尼亚州库比蒂诺 Splashtop 在简化远程办公解决方案领域处于领先地位&#xff0c;今天宣布继去年收购 Foxpass 之后&#xff0c;新的 Foxpass 业务实现了62%的增长。Splashtop 的 Foxpass Cloud RADIUS 可确保企业 Wi-Fi 网络安全&#xff0c;防止未经授权…

PaddleOCR 表格识别,docker部署,cpu版本

前置环境 centeros7 docker 拉取镜像 docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.1 参考&#xff1a;开始使用_飞桨-源于产业实践的开源深度学习平台 这里拉取的镜像并不能立马用&#xff0c;只是内置好运行环境 随便找个目录下载paddleocr的代码 git…

死磕P7: JVM垃圾回收那点事,轻松拿捏不是事儿(二)

这是「死磕P7」系列第 004 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。&#xff08;公&号&#xff1a;新质程序猿&#xff0c;更新会更及时&#xff0c;内容也会更全面丰富&#xff0c;欢迎大家关注…

神仙级AI产品经理入门手册,从入门到入魂非常详细,收藏这一篇,少走三年弯路!!!

作为一个产品经理&#xff0c;你可能已经熟悉了一些常见的AI技术和应用&#xff0c;比如机器学习、深度学习、自然语言处理、计算机视觉等。 但是&#xff0c;你是否了解什么是大模型&#xff1f;大模型又有什么特点和优势&#xff1f;为什么大模型会成为AI领域的一个重要趋势…