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 ...
随机推荐
- 1.3 Quick Start中 Step 2: Start the server官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 2: Start the server Step : 启动服务 Kafka ...
- java的23中设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- [UWP]为什么ContentControl的ContentTemplate里放两个ContentPresenter会出问题(绕口)
原文:[UWP]为什么ContentControl的ContentTemplate里放两个ContentPresenter会出问题(绕口) 1. 简单的HeaderedContentControl 上 ...
- [React] Theme your application with styled-components and "ThemeProvider"
In this styled-components lesson, we set a "primary color" within a UI "theme" o ...
- 例说linux内核与应用数据通信(一):加入一个系统调用
[版权声明:尊重原创.转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 应用不能訪问内核的内存空间.为了应用和内核交互信息,内核提供一 ...
- js进阶 13-11/12 jquery如何实现折叠导航
js进阶 13-11/12 jquery如何实现折叠导航 一.总结 一句话总结:还是用的slideToggle滑动效果,并且这一个展开时,所有兄弟都关闭. 1.文字缩进怎么设置? 感觉设置margin ...
- Codeforces Round 363 Div. 1 (A,B,C,D,E,F)
Codeforces Round 363 Div. 1 题目链接:## 点击打开链接 A. Vacations (1s, 256MB) 题目大意:给定连续 \(n\) 天,每天为如下四种状态之一: 不 ...
- JS中的闭包问题总结
严格意义上的闭包,严格闭包通过栈内存不销毁,保护内部变量,而且下一级作用域可以访问内部变量 更严格意义上的闭包,函数可以在父函数外面调用父函数作用域的值 在函数执行的时候,函数体中有返回值,函数执行的 ...
- DE1-SOC学习
https://people.ece.cornell.edu/land/courses/ece5760/DE1_SOC/HPS_peripherials/index.html https://peop ...
- UVA 11039 - Building designing 水题哇~
水题一题,按绝对值排序后扫描一片数组(判断是否异号,我是直接相乘注意中间值越界)即可. 感觉是让我练习sort自定义比较函数的. #include<cstdio> #include< ...