测试的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的一些坑的更多相关文章

  1. 伪分布式hbase从0.94.11版本升级stable的1.4.9版本

    Hbase从0.94.11升级到stable的1.4.9版本: 升级思路: hadoop1.1.2    hbase 0.94.11                             ↓ had ...

  2. 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. ...

  3. 八年技术加持,性能提升10倍,阿里云HBase 2.0首发商用

    摘要: 早在2010年开始,阿里巴巴集团开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储,HBase在几代阿里专家的不懈努力下,已经表现得运行更稳定.性能更高效 ...

  4. EF Core 3.0 Preview 9 的2个小坑

    之前我们的数据库服务器使用的是 SQL Server 2008 R2 ,由于从 EF Core 3.0 Preview 6 开始不支持 UseRowNumberForPaging ,只能停留在 EF ...

  5. HBase(0.94.5)的Compact和Split源码分析

    经过对比,0.94.5以后版本主要过程基本类似(有些新功能和细节增加) 一.       Compact 2.1.   Compact主要来源 来自四个方面:1.Memstoreflush时:2.HR ...

  6. HBase编程 API入门系列之delete(客户端而言)(3)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面的基础,如下 HBase编程 API入门系列之put(客户端而言)(1) HBase编程 API入门系列之get(客户端而言) ...

  7. HBase编程 API入门系列之delete(管理端而言)(9)

    大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门之delete(客户端而言) 就知道,在这篇博文里,我是在客户端里删除HBase表的. 这里,我带领大家,学习更高级的,因为,在开发中 ...

  8. HBase编程 API入门系列之delete.deleteColumn和delete.deleteColumns区别(客户端而言)(4)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. delete.deleteColumn和delete.deleteColumns区别是: deleteColumn是删除某一个列簇 ...

  9. 【甘道夫】HBase(0.96以上版本号)过滤器Filter具体解释及实例代码

    说明: 本文參考官方Ref Guide,Developer API和众多博客.并结合实測代码编写.具体总结HBase的Filter功能,并附上每类Filter的对应代码实现. 本文尽量遵从Ref Gu ...

随机推荐

  1. 基于cropper.js的图片上传和裁剪

    项目中要求图片上传并裁剪的功能,之前也有接触过很多图片裁剪插件,效果体验不是很好,今天推荐一款好用的插件-cropper,超级好用,裁剪功能丰富,满足了各种需求. 功能: 1:点击选择图片,弹出文件夹 ...

  2. windows CE项目开发

    软件列表 1.Windows mobile 设备中心 2.Microsoft visual Studio 2008 3.串口调试工具(sscom42.exe) 4.Wince 6.0模拟器 5.vir ...

  3. 通过wmi获取本地硬件信息的一些疑问。

    通过wmi获取本地硬件信息的一些疑问. http://bbs.csdn.net/topics/391017789 http://blog.csdn.net/xcntime/article/detail ...

  4. iOS_05_变量的内存分析、Scanf函数

    一.变量的内存分析 1.字节和地址 * 为了更好地理解变量在内存中得存储细节,先来认识一下内存中得”字节“和”地址“. * 内存以字节为单位 * 不同类型占用的字节是不一样的,数据越大,所需的字节数九 ...

  5. PythonNET网络编程1

    # PythonNET 网络编程 ISO(国际标准化组织) 制定了 OSI(Open System Interconnectio),意为开放式系统互联.国际标准化组织(ISO)制定了OSI模型,该模型 ...

  6. dinic算法学习(以poj1273为例)

    Dinic 算法模板  Dinic算法是一种比較easy实现的.相对照较快的最大流算法. 求最大流的本质,就是不停的寻找增广路径.直到找不到增广路径为止. 对于这个一般性的过程,Dinic算法的优化例 ...

  7. html练习(3)

    1.这个小练习用到了css的四种选择器id选择器,类选择器,html选择器,通配符选择器. (1)假设一个元素中用到了各种选择器,而且选择器中的属性发生了冲突,则 优先级为id选择器>类选择器& ...

  8. LA 4329 - Ping pong 树状数组(Fenwick树)

    先放看题传送门 哭瞎了,交上去一直 Runtime error .以为那里错了. 狂改!!!!! 然后还是一直... 继续狂改!!!!... 一直.... 最后发现数组开小了.......... 果断 ...

  9. 3、C++快速入门

    参考书籍: C++程序设计教程_第二版_钱能    //篇幅较少,适合快速学习 C++ Primer Plus  第六版  中文版   //篇幅较大,讲的非常详细 C++一般必须包含的头文件是#inc ...

  10. [WASM] Call a JavaScript Function from WebAssembly

    Using WASM Fiddle, we show how to write a simple number logger function that calls a consoleLog func ...