hbase 2.0.2 put和delete的一些坑


测试的inbox表为多版本表,封装的scanTable已设置查询全部版本,以下的测试基于hbase2.0.2

一.put(针对相同的rowkey)

测试1.使用方法链的形式对同一个put添加数据到不同的列

 1      Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));  2         Put inboxPut = new Put(Bytes.toBytes("1"));  3         
 4         //测试1 同一个put添加到相同的列,虽然遍历结果和预期相同,但实际只有后一个addColumn插入到表中
 5         inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"))  6         .addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993"));  7         
 8  inbox.put(inboxPut);  9         
10         
11         CellScanner cs = inboxPut.cellScanner(); 12         System.out.println("------put中的数据------"); 13         while(cs.advance()) { 14             Cell cell = cs.current(); 15             System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell))); 16             System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell))); 17             System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell))); 18             System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell))); 19  } 20         scanTable(TABLE_INBOX);

控制台结果:

可以看到put中的数据是正确的但是真正插入的数据只有最后一个版本

 

测试2.putlist,两个put(rowkey相同),添加到相同的列

先对测试表进行清空,然后执行以下代码

 1         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));  2         Put inboxPut = new Put(Bytes.toBytes("1"));  3         inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988"));  4         Put inboxPut2 = new Put(Bytes.toBytes("1"));  5         inboxPut2.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993"));  6         List<Put> list = new ArrayList<Put>();  7  list.add(inboxPut);  8  list.add(inboxPut2);  9  inbox.put(list); 10         
11         scanTable(TABLE_INBOX);

结果:

仍然只有一个版本数据,第二版本覆盖了第一个版本

 

测试3.两个put(rowkey相同)插入到同一列

还是先清空测试表,然后执行以下代码

1         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX)); 2         Put inboxPut = new Put(Bytes.toBytes("1")); 3         inboxPut.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724988")); 4         Put inboxPut2 = new Put(Bytes.toBytes("1")); 5         inboxPut2.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"),Bytes.toBytes("2_1542887724993")); 6         
7  inbox.put(inboxPut); 8  inbox.put(inboxPut2); 9         scanTable(TABLE_INBOX);

结果:

这次结果与预期一致,两个版本均插入到了表中

总结:put插入数据时.对于同一rowkey,相同列族下列名相同的列,方法链以及putList的形式均会对插入的多个版本进行覆盖,目前的解决方式是对于一个put.table就put下

 

二.delete

 为了方便测试,先对测试表插入了一些数据,即rowkey=1,info:2 下面有两个版本的数据

测试1.只使用一次addColumn

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

结果:

可以看到只删除了一个版本

 

测试2.使用方法链的形式,删除两个版本

先把测试表的数据恢复成两个版本,然后执行以下代码

1        //测试2 方法链
2         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX)); 3         Delete delete = new Delete(Bytes.toBytes("1")); 4         delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2")) 5               .addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2")); 6  inbox.delete(delete); 7         scanTable(TABLE_INBOX);

结果:

两个版本数据均被删除,满足预期

 

测试3.deleteList

先把测试表恢复成两个版本的数据,然后执行以下代码

 1         //测试3 deleteList
 2         Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX));  3         Delete delete = new Delete(Bytes.toBytes("1"));  4         delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));  5         Delete delete2 = new Delete(Bytes.toBytes("1"));  6         delete.addColumn(Bytes.toBytes(CF_INFO),Bytes.toBytes("2"));  7         
 8         List<Delete> list = new ArrayList<Delete>();  9  list.add(delete); 10  list.add(delete2); 11         
12  inbox.delete(list); 13         scanTable(TABLE_INBOX);

结果与预期相符

 

测试4. 使用addColumns

先把测试表数据恢复成两个版本,然后执行以下代码

1        Table inbox = conn.getTable(TableName.valueOf(TABLE_INBOX)); 2         Delete delete = new Delete(Bytes.toBytes("1")); 3         delete.addColumns(Bytes.toBytes(CF_INFO),Bytes.toBytes("2")); 4  inbox.delete(delete); 5         scanTable(TABLE_INBOX);

结果满足预期

 

总结:上面只是删除两个版本的数据,删除多版本的时候建议使用addColumns,可以一次性删除某个列的全部版本数据


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM