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