删除API详解

Hbase--API删除数据详解

一:代码实现如下:#

Copy
public classTestHbaseConnect { private static Configuration config=null;//配置文件对象 private static Connection connection=null;//连接对象 private static Admin admin=null;//管理员对象,对表的相关操作 static { try { //1.获取hbase的配置文件对象 config=HBaseConfiguration.create(); config.set(<span class="token string">"hbase.zookeeper.quorum", //2.获取管理员对象 //HBaseAdmin admin=new HBaseAdmin(conf); connection<span>=ConnectionFactory.createConnection(config); //3.创建管理员admin对象 admin=connection.getAdmin(); } catch (<span class="token class-name">Exception e) { // TODO: handle exception } } public static void main(String[] args) throws MasterNotRunningException, ZooKeeperConnectionException, IOException { deleteData(<span class="token string">"HbaseAPI:HbaseAPI01", <span class="token string">"000001", <span class="token string">"info02", <span class="token string">"name"); } /** * 8.删除数据 */ public static void deleteData(String tableName,String rowkey,String family,String qualifier) throws IOException { //1.获取表对象 Table table=connection.getTable(TableName.valueOf(tableName));// //2.构建删除对象 Delete delete=newDelete(Bytes.toBytes(rowkey)); //2.1设置删除的列 //delete.addColumn(family, qualifier);//如果传入的参数有时间戳,就给指定时间戳的版本打上删除标记;否则,只删除最新的版本 //delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(qualifier));//如果传入的参数有时间戳,就给删除小于等于这个时间戳之前版本打上删除标记的内容;如果没有传入参数时间戳,就给删除所有的版本打上删除标记 //2.2删除指定的列族 delete.addFamily(Bytes.toBytes(family)); //3.执行删除操作 table.delete(delete); //4.关闭表连接 table.close(); } /** * 关闭资源和连接 * @throws IOException */ public static void close() throws IOException { //关闭连接 if (admin!=null) { admin.close(); } if (connection!=null) { connection.close(); } } }

二:分析和实践#

javaAPI删除Hbase的数据有三种方式,hbase删除数据,并不是马上删掉,只是对数据打一个删除标记,真正删除数据是等到下一次major_compact(除非KEEP_DELETED_CELLS=true)。

1) 删除指定的rowkey下的所有数据

当采用只指定rowkey的时候,main测试指定rowkey为“000002”

Copy
deleteData("HbaseAPI:HbaseAPI01", "000001","info02","name");

在Hbase中执行

Copy
scan “HbaseAPI:HbaseAPI01”,{RAW=&gt;TRUE,VERSION=&gt;10};

扫描表发现rowkey为“00002”的数据已经成功删除,并且查看到标记是 type=DeleteFamily
DeleteFamily:表示是一个一个列族删除的,并不是直接删除rowkey="000002"的所有数据

在这里插入图片描述

2)删除指定删除指定的列族
删除指定的列族需要在通过rowkey构建删除对象delete之后,delete调用方法

Copy
delete.addFamily(Bytes.toBytes(family))
在这里插入图片描述

使用scan "HbaseAPI:HbaseAPI01"已经没有返回数据了,但是执行

Copy
scan “HbaseAPI:HbaseAPI01”,{RAW=&gt;TRUE,VERSION=&gt;10};

看到刚才能显示的数据都被打上标签DeleteFamily

Copy
public static void deleteData(String tableName,String rowkey,String family,String qualifier) throws IOException { //1.获取表对象 Table table=connection.getTable(TableName.valueOf(tableName));// //2.构建删除对象 Delete delete=newDelete(Bytes.toBytes(rowkey)); //2.1设置删除的列 //delete.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier)); //delete.addColumns(Bytes.toBytes(family),Bytes.toBytes(qualifier)); //2.2删除指定的列族 //delete.addFamily(Bytes.toBytes(family)); //3.执行删除操作 table.delete(delete); //4.关闭表连接 table.close(); }

3) 删除指定的列
删除指定的列族需要在通过rowkey构建删除对象delete之后,delete调用方法

delete.addColumn()或者delete.addColumns(),这两个方法有什么区别呢?查看源码:
1.addColumn()

Copy
addColumn(family, qualifier)#参数没有传入时间戳
  • 这个addColumn()方法会先去查找最新的时间戳,然后调用deleteColumn()方法,将family,qualifier,查找到的时间戳当做参数传给deleteColumn()方法
  • 而最终deleteColumn()方法直接返回了addColumn(family, qualifier, timestamp)

所以如果addColumn()传参没有时间戳的最终就会删除最新的时间戳的那个版本的数据,如果传参有时间戳的话就会删除指定时间戳的版本的数据

2.addColumns()

如果传入的参数有时间戳,就给删除小于等于这个时间戳之前版本的数据;如果没有传入参数时间戳,就给删除所有的版本的数据

3.测试

使用delete.addColumn()设置删除对象;
在Hbase中执行scan “HbaseAPI:HbaseAPI01”,{RAW=>TRUE,VERSION=>10};
扫描表发现数据已经成功删除,并且查看到标记是 type=Delete:表示是删除精确到一条数据,这个是特殊的,假如有多个版本的数据,只会删除最新的,删除最新的之后旧的版本就又会显示出来;

使用delete.addColumns()设置删除对象;
扫描表发现数据已经成功删除,并且查看到标记是type=DeleteColumn;

在这里插入图片描述
posted @   Q1Zhen  阅读(414)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示
CONTENTS