2012-11-09 46 views
4

是否可以通過hbase java API按行ID列表獲取hbase數據記錄?hbase api - 按行ID列表獲取數據行信息

例如,我有HBase的行ID的已知列表:

mykey1:myhash1, mykey1:myhash2, mykey1:myhash3, mykey2:myhash5, ...

和我希望通過單個調用來獲取所有相關的列單元信息。我對hbase很陌生,我不知道這甚至是API支持的。

API僞代碼:

GetById(String tableName, List<byte[]> rowIds); 

類似的東西?

我可以從Get(byte[] rowName)的單行檢索信息,但是當我有rowIds列表時,我需要多次執行get操作,這會導致建立連接並在每次完成時關閉它。

感謝

回答

12

傳遞Get操作的列表爲一批電話:

... 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.client.Get; 
import org.apache.hadoop.hbase.client.HTable; 
import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.util.Bytes; 
... 
     HTable htable = null; 
     try { 
      htable = new HTable(conf, "mytable"); 
      List<Get> queryRowList = new ArrayList<Get>(); 
      queryRowList.add(new Get(Bytes.toBytes("mykey1:myhash1"))); 
      queryRowList.add(new Get(Bytes.toBytes("mykey1:myhash2"))); 
      queryRowList.add(new Get(Bytes.toBytes("mykey1:myhash3"))); 
      queryRowList.add(new Get(Bytes.toBytes("mykey2:myhash5"))); 

      Result[] results = htable.get(queryRowList); 
      for (Result r : results) { 
       //do something 
      } 
     } 
     finally { 
      if (htable != null) { 
       htable.close(); 
      } 
     } 
... 
+0

感謝,這就像一個魅力:) – jMn

+2

工作,如果連一個鍵不存在,則表中的結果[]會空着。有更好的行爲嗎? – Gevorg

0

您可以使用MultiAction爲多得到一個容器(或者說,刪除以及它們的組合),您可以在批處理執行。

這就是說,請注意,您可以執行多個獲取操作,而無需每次關閉/重新打開連接。