測試的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,可以一次性刪除某個列的全部版本數據