2016-11-06 82 views
0

我有HBase表,其中包含大約10百萬條記錄。 我有三個關於HBase的問題如何做HBase部分掃描?

  1. 掃描10百萬條記錄需要多少時間?
  2. 我應該參加HIVE HBase集成嗎?
  3. 如果我在每行中只加入一個標識符FL01,如何執行部分範圍掃描?

4294970043 | 1
柱= CF:SegmentMultipleFundbDescription,時間戳= 1478316937790, 值= 4294970043 | 1個
柱= CF:SegmentMultipleFundbDescription_languageId, 時間戳= 1478316937790,值= 505074 4294970043 | 1
柱= CF:StatementTypeCode,時間戳= 1478316937790,值= FTN 4294970929 | 1柱= CF:FFAction, 時間戳= 1478316937790,值= I 4294970929 | 1個
柱= CF:文件名,時間戳= 1478316937 790, 值= Fundamental.FinancialLineItem.FinancialLineItem.ThirdPartyPrivate.FTN.1.2 016-07-15-2108.Full 4294970929 | 1柱= CF:FilePartition, 時間戳= 1478316937790,值= ThirdPartyPrivate 4294970929 | 1
柱=比照:FilePartitionLocation,時間戳= 1478316937790,值= FTN 4294970929 | 1個
柱= CF:FinancialConceptCodeGlobalSecondary, 時間戳= 1478316937790,值= 4294970929 | 1個
柱= CF:FinancialConceptCodeGlobalSecondaryId, 時間戳= 1478316937790,值= 4294970929 | 1
column = cf:FinancialConceptGlobal,timestamp = 1478316937790,value = METL 4294970929 | 1
列= CF:FinancialConceptGlobalId,時間戳= 1478316937790, 值= 3015071

回答

0

HBASE會做一個FTS,除非和直到你提供一個啓動和停止行鍵。因此,如果標識符是行鍵的一部分,並且行鍵是固定的,那麼您可以嘗試設置開始和停止行鍵,否則嘗試使用模糊過濾器。否則,如果標識符不是行鍵的一部分,HBASE會執行FTS。

多少時間花費在掃描確實取決於多種因素,如行鍵的大小,多少CF,有多少列預選賽......

0

假設你的鑰匙是字符串,該行返回地圖列表中,那麼你的範圍掃描應該看起來像下面的代碼。

public List<Map<String,byte[]>> rangeFetch(String valueFrom, String valueTo, String[] columns, int maxrows) { 
    ArrayList<Map<String,byte[]>> rst = new ArrayList<Map<String,byte[]>>(); 
    Scan scn = new Scan(); 
    scn.setStartRow(valueFrom.getBytes()); 
    scn.setStopRow (valueTo.getBytes()); 
    for (String colName : columns) { 
     scn.addColumn(colName.getBytes()); 
    } 
    ResultScanner rsc = null; 
    int rowCount = 0; 
    try { 
     rsc = oTbl.getScanner(scn); 
     for (Result res=rsc.next(); res!=null && rowCount<maxrows; res=rsc.next()) { 
      Map<String,byte[]> row = new HashMap<String,byte[]>(); 
      for (String colName : columns) { 
       KeyValue kvl = res.getColumnLatest("columnFamilyName".getBytes(), colName.getBytes()); 
       if (kvl!=null) { 
        if (kvl.getValue()!=null) 
         row.put(colName, kvl.getValue()); 
       } 
      } // next 
      rst.add(row);    
     } // next 
    } finally { 
     if (rsc!=null) rsc.close(); 
    } 
    return rst; 
} 

然後用

List<Map<String,byte[]>> results = yourObj.rangeFetch("FL01"+"000000", "FL01"+"999999", new String[]{"column1","column2","column3"}, 10000); 
叫它