2017-03-07 54 views
0

我正在使用HBase RowFilter來搜索某些包含輸入字符串(在我的情況下是uid)的rowkeys,並且我想將所有結果數據存儲到列表中,並且顯示它們。無法將java temp列表附加到更大的列表

下面的代碼,如果我只輸入一個uid(uidArr只有一個元素),它可以正常工作。但是當我輸入兩個或更多時,列表有時會返回結果的一部分。例如,如果輸入的uid是:AAAA0000,AAAB0001,AAAC0002,則它可能只顯示其中一個或兩個的表信息,而不是所有三個都預期地顯示。

Only the first uid's information is list

public List<HBaseTableData> getTableCertainRowKeyData(String tableName, 
      String cfs, String rowkeys, int versions) throws IOException { 

     String[] uidArr = StringUtils.split(rowkeys, Utils.COMMA); 
     Connection connection = HadoopUtils.getHBaseConnection(); 
     Table table = connection.getTable(TableName 
       .valueOf(tableName)); 

     List<HBaseTableData> list = new ArrayList<>(); 
     List<HBaseTableData> TMPlist = new ArrayList<>(); 

     try { 
      Scan scan = new Scan(); 
      for (String uid : uidArr) { 
       Filter filter1 = new RowFilter(CompareFilter.CompareOp.EQUAL, 
        new SubstringComparator(uid)); 
       scan.setFilter(filter1); 
       scan.setMaxVersions(versions); 
       ResultScanner scanner1 = table.getScanner(scan); 

       Cell[] cells; 
       for (Result res : scanner1) { 
        cells = res.rawCells(); 

        TMPlist.addAll(getHBaseTableDataListFromCells(cells)); 
        list.addAll(TMPlist); 
        TMPlist.clear(); 
       } 
      } 

      return list; 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

回答

0

你爲什麼要這麼做? TMPlist.addAll(getHBaseTableDataListFromCells(cells)); list.addAll(TMPlist); TMPlist.clear();

並不僅僅是這樣

list.addAll(getHBaseTableDataListFromCells(cells)) 

開始。並跳過錯誤命名的變量TMPlist。

+0

我以前試過,如果使用「list.addAll(getHBaseTableDataListFromCells(cells))」也會出現同樣的問題。所以我添加了一個臨時List來查看這個問題是否可以解決。 – haohuily

+0

好的只是想指向不必要的代碼。有一件事,你是否試圖在getHBaseTableDataListFromCells(cells)中看到你回​​到你期望的內容,我懷疑addAll方法會失敗。也嘗試調試你的應用程序,然後你會看到所有的變量和它們包含的內容。 – 7663233

+0

哦,我已經通過調試解決了這個問題。事實上,這不是列表中的問題,這是'掃描'的問題。 'Scan scan = new Scan()'的正確位置應該在第一個'for'循環中。如果把這句話放在循環之外,'掃描'會被搞亂。不管怎樣,謝謝你! – haohuily