hbase 2.0.2 put和delete的一些坑
测试的inbox表为多版本表,封装的scanTable已设置查询全部版本,以下的测试基于hbase2.0.2
一.put(针对相同的rowkey)
测试1.使用方法链的形式对同一个put添加数据到不同的列
Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
Put inboxPut = new Put(Bytes.toBytes("1")); //测试1 同一个put添加到相同的列,虽然遍历结果和预期相同,但实际只有后一个addColumn插入到表中
inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"))
.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993")); inbox.put(inboxPut); CellScanner cs = inboxPut.cellScanner();
System.out.println("------put中的数据------");
while(cs.advance()) {
Cell cell = cs.current();
System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell)));
System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
}
scanTable(TABLE_INBOX);
控制台结果:

可以看到put中的数据是正确的但是真正插入的数据只有最后一个版本
测试2.putlist,两个put(rowkey相同),添加到相同的列
先对测试表进行清空,然后执行以下代码
Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
Put inboxPut = new Put(Bytes.toBytes("1"));
inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"));
Put inboxPut2 = new Put(Bytes.toBytes("1"));
inboxPut2.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993"));
List<Put> list = new ArrayList<Put>();
list.add(inboxPut);
list.add(inboxPut2);
inbox.put(list); scanTable(TABLE_INBOX);
结果:

仍然只有一个版本数据,第二版本覆盖了第一个版本
测试3.两个put(rowkey相同)插入到同一列
还是先清空测试表,然后执行以下代码
Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
Put inboxPut = new Put(Bytes.toBytes("1"));
inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"));
Put inboxPut2 = new Put(Bytes.toBytes("1"));
inboxPut2.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993")); inbox.put(inboxPut);
inbox.put(inboxPut2);
scanTable(TABLE_INBOX);
结果:

这次结果与预期一致,两个版本均插入到了表中
总结:put插入数据时.对于同一rowkey,相同列族下列名相同的列,方法链以及putList的形式均会对插入的多个版本进行覆盖,目前的解决方式是对于一个put.table就put下
二.delete
为了方便测试,先对测试表插入了一些数据,即rowkey=1,info:2 下面有两个版本的数据

测试1.只使用一次addColumn
//测试1 只使用一次addColumn
Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
Delete delete = new Delete(Bytes.toBytes("1"));
delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
inbox.delete(delete);
scanTable(TABLE_INBOX);
结果:

可以看到只删除了一个版本
测试2.使用方法链的形式,删除两个版本
先把测试表的数据恢复成两个版本,然后执行以下代码
//测试2 方法链
Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
Delete delete = new Delete(Bytes.toBytes("1"));
delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"))
.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
inbox.delete(delete);
scanTable(TABLE_INBOX);
结果:

两个版本数据均被删除,满足预期
测试3.deleteList
先把测试表恢复成两个版本的数据,然后执行以下代码
//测试3 deleteList
Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
Delete delete = new Delete(Bytes.toBytes("1"));
delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
Delete delete2 = new Delete(Bytes.toBytes("1"));
delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2")); List<Delete> list = new ArrayList<Delete>();
list.add(delete);
list.add(delete2); inbox.delete(list);
scanTable(TABLE_INBOX);
结果与预期相符

测试4. 使用addColumns
先把测试表数据恢复成两个版本,然后执行以下代码
Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));
Delete delete = new Delete(Bytes.toBytes("1"));
delete.addColumns(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));
inbox.delete(delete);
scanTable(TABLE_INBOX);
结果满足预期

总结:上面只是删除两个版本的数据,删除多版本的时候建议使用addColumns,可以一次性删除某个列的全部版本数据
hbase 2.0.2 put和delete的一些坑的更多相关文章
- 伪分布式hbase从0.94.11版本升级stable的1.4.9版本
Hbase从0.94.11升级到stable的1.4.9版本: 升级思路: hadoop1.1.2 hbase 0.94.11 ↓ had ...
- hbase 2.0.2 分布式安装配置/jar包替换
环境 zk: 3.4.10 hadoop 2.7.7 jdk8 hbase 2.0.2 三台已安装配置好的hadoop002,hadoop003,hadoop004 1.上传并解压hbase-2.1. ...
- 八年技术加持,性能提升10倍,阿里云HBase 2.0首发商用
摘要: 早在2010年开始,阿里巴巴集团开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储,HBase在几代阿里专家的不懈努力下,已经表现得运行更稳定.性能更高效 ...
- EF Core 3.0 Preview 9 的2个小坑
之前我们的数据库服务器使用的是 SQL Server 2008 R2 ,由于从 EF Core 3.0 Preview 6 开始不支持 UseRowNumberForPaging ,只能停留在 EF ...
- HBase(0.94.5)的Compact和Split源码分析
经过对比,0.94.5以后版本主要过程基本类似(有些新功能和细节增加) 一. Compact 2.1. Compact主要来源 来自四个方面:1.Memstoreflush时:2.HR ...
- HBase编程 API入门系列之delete(客户端而言)(3)
心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面的基础,如下 HBase编程 API入门系列之put(客户端而言)(1) HBase编程 API入门系列之get(客户端而言) ...
- HBase编程 API入门系列之delete(管理端而言)(9)
大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门之delete(客户端而言) 就知道,在这篇博文里,我是在客户端里删除HBase表的. 这里,我带领大家,学习更高级的,因为,在开发中 ...
- HBase编程 API入门系列之delete.deleteColumn和delete.deleteColumns区别(客户端而言)(4)
心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. delete.deleteColumn和delete.deleteColumns区别是: deleteColumn是删除某一个列簇 ...
- 【甘道夫】HBase(0.96以上版本号)过滤器Filter具体解释及实例代码
说明: 本文參考官方Ref Guide,Developer API和众多博客.并结合实測代码编写.具体总结HBase的Filter功能,并附上每类Filter的对应代码实现. 本文尽量遵从Ref Gu ...
随机推荐
- 第二遍回顾--①前端flex布局
1.flex: 弯曲,收缩 2.概念 2条主轴,main axis,cross axis; 每个单元为flex item,主轴空间main size,交叉轴空间cross size; 3.容器 .co ...
- Java Web学习总结(15)——JSP指令
一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...
- Java对ad操作
转载:http://blog.csdn.net/binyao02123202/article/details/18697953
- android studio 一次编译错误:Error:Minimum supported Gradle version is 2.14.1.
因为需要,今天从git上重新下载工程到另一个目录下,结果运行的时候报了这个错:Error:Minimum supported Gradle version is 2.14.1. Current ve ...
- Altium Designer中画pcb如何隐藏和显示地线
如何隐藏: 如何显示: 按下N后
- common daemon
http://zdsyouxiang.iteye.com/blog/1940202 http://commons.apache.org/proper/commons-daemon/procrun.ht ...
- vim 保存文件的回车换行模式
设置模式:unix,dos :set fileformat=unix fileforman可以直接缩写为ff
- [算法系列之二十七]Kruskal最小生成树算法
简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...
- ThinkPHP视图查询
ThinkPHP视图查询 一.总结 1.这里的视图查询和多表查询很像,当然多表查询的话肯定要支持左右链接查询 2.view:视图的使用,关键字是view 3.sql视图功能支持:thinkphp支持视 ...
- android 指定时间加一个小时算法
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class My ...