测试的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,可以一次性删除某个列的全部版本数据