2017-03-07 84 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