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