2016-09-22 81 views
3

我使用HBase的API訪問谷歌的Cloud Bigtable,但每當我試圖刪除列:如何刪除單行的列在谷歌的Cloud Bigtable與HBase的API

Delete delete = new Delete(r.getRow()); 
delete.addColumn(CF, Bytes.toBytes(d.seqid())); 
delete.addColumn(CF, COL_LEASE); 
tasksTable.delete(delete); 

我m如果一個UnsupportedOperationException

java.lang.UnsupportedOperationException: Cannot delete single latest cell. 
at com.google.cloud.bigtable.hbase.adapters.DeleteAdapter.throwIfUnsupportedPointDelete(DeleteAdapter.java:85) 
at com.google.cloud.bigtable.hbase.adapters.DeleteAdapter.adapt(DeleteAdapter.java:141) 
at com.google.cloud.bigtable.hbase.adapters.HBaseRequestAdapter.adapt(HBaseRequestAdapter.java:71) 
at com.google.cloud.bigtable.hbase.BigtableTable.delete(BigtableTable.java:307) 
at queue.BigTableRowBackedQueue.poll(BigTableRowBackedQueue.java:54) 

我在code it occurs here看到。

我可以從HBase Java客戶端中刪除整行,我可以使用HBase shell精細地刪除各個列。

如何在不刪除Java客戶端中的行的情況下刪除列?

回答

7

對不起,你的麻煩。 Bigtable和HBase在幾個方面有所不同,這是其中之一。

Delete delete = new Delete(rowKey); 
delete.addColumns(COLUMN_FAMILY, qual); // the 's' matters 
table.delete(delete); 

HBase的Delete.addColumn只從列中刪除最新的單元格。 Delete.addColumn_s_意味着刪除所有單元格(即所有不同的時間戳)。或者,您可以通過Delete.addColumn(byte[], byte[], long)刪除特定的單元格,其中long是時間戳。

hbase shell刪除usesdeleteColumns它映射到addColumns下封面。它也使用s變體,這就是它工作的原因。

僅供參考here是我們完整的TestDelete套件,用於識別您使用的用例@Category(KnownGap.class),我們用它來識別Bigtable客戶端中缺少HBase功能的差異。