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 ...
随机推荐
- php-wamp环境搭建
wamp(Windows,Apache,Mysql,PHP) win8.1下搭建apache2.4(64位) php5.6.11(64位) mysql5.6.24(32位) d盘创建文件结构为: ...
- Android 监听电量的状态
监控手机电量的变化和充电状态 在BatteryManager中有一个粘性广播,不需要BroadcastReceiver作为接收器,在注册时将传入null IntentFilter filter = n ...
- LeetCode Algorithm 06_ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- DC中检查脚本错误
dcprocheck + 要检查的tcl文件
- 汉字转换成对应ASCII
private static byte[] hanziToHexByte(string hanzistring) { byte[] bytes = Encoding ...
- amazeui学习笔记--js插件(UI增强2)--按钮交互Button
amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...
- 从零开始使用git第二篇:git的日常操作
从零开始使用git 第二篇:git的日常操作 第一篇:从零开始使用git第一篇:下载安装配置 第二篇:从零开始使用git第二篇:git实践操作 第三篇:从零开始使用git第三篇:git撤销操作.分支操 ...
- [CSS] Use CSS Counters to Create Pure CSS Dynamic Lists
CSS counters let you create dynamic lists without JavaScript. In this lesson, we will create a multi ...
- ARM+linux学习过程(1)虚拟机下ubuntu上网
总结:(1)通过bridge方式也可以实现ubuntu上网(只要PC物理网卡能上网),可以实现ping通主机和开发板 (2)要想上网简单上网,可以通过nat方式,在vmware中设置为nat方式,选择 ...
- 6、USB Video Class Specification
关于USB Class 将设备归为既定的类别,并对相应类别的设备的在USB协议的应用级协议和接口作出规范,这样只要按照类设备的标准实现驱动程序和设备,则一套驱动可以驱动这一类的所有设备,而这一类设备可 ...