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;
}
我以前试过,如果使用“list.addAll(getHBaseTableDataListFromCells(cells))”也会出现同样的问题。所以我添加了一个临时List来查看这个问题是否可以解决。 – haohuily
好的只是想指向不必要的代码。有一件事,你是否试图在getHBaseTableDataListFromCells(cells)中看到你回到你期望的内容,我怀疑addAll方法会失败。也尝试调试你的应用程序,然后你会看到所有的变量和它们包含的内容。 – 7663233
哦,我已经通过调试解决了这个问题。事实上,这不是列表中的问题,这是'扫描'的问题。 'Scan scan = new Scan()'的正确位置应该在第一个'for'循环中。如果把这句话放在循环之外,'扫描'会被搞乱。不管怎样,谢谢你! – haohuily