我有巨大的数据集(键值)在Rocks中,我必须搜索基于键前缀的键在手上。我不想扫描整个数据集,以筛选出基于密钥前缀的密钥。有什么办法吗?
发布于 2016-09-17 09:10:37
你可以用这样的东西。使用RocksIterator,有一个api公开了,您可以在其中查找键子字符串,如果您的键以前缀开头,那么请考虑该键。
请找到样本代码。
List<String> result = new ArrayList<String>();
RocksIterator iterator = db.newIterator();
for (iterator.seek(prefix.getBytes()); iterator.isValid(); iterator
.next()) {
String key = new String(iterator.key());
if (!key.startsWith(prefix))
break;
result.add(String.format("%s", new String(iterator.key())));
}希望它能帮到你。
发布于 2022-06-20 09:54:45
@Pramatha V的答案很好,尽管我对代码做了一些改进。我不是在每次迭代中反序列化迭代器键。我正在使用来自Bytes.increment()的卡夫卡常见用途 (您可以提取这个类并直接在代码中使用它)。这个函数通过添加1来增加底层字节数组。通过这种方法,我可以找到下一个比前缀键更大的键。我使用BYTES_LEXICO_COMPARATOR (也来自同一个类)进行比较,但是您可以自由地实现和使用您的比较器。此外,函数返回字节数组的映射,您可以在后面的代码中反序列化该映射。
public Map<byte[], byte[]> prefixScan(final byte[] prefix) {
final Map<byte[], byte[]> result = new HashMap<>();
RocksIterator iterator = db.newIterator();
byte[] rawLastKey = increment(prefix);
for (iterator.seek(prefix); iterator.isValid(); iterator.next()) {
if (Bytes.BYTES_LEXICO_COMPARATOR.compare(iterator.key(), rawLastKey) > 0
|| Bytes.BYTES_LEXICO_COMPARATOR.compare(iterator.key(), rawLastKey) == 0) {
break;
}
result.put(iterator.key(), iterator.value());
}
iterator.close();
return result;
}发布于 2020-06-21 22:09:01
搜寻工作很慢。在SSD磁盘上5.35秒,10亿条记录。
键的大小是固定的16个字节。搜索8个字节。
2个长字节xx,xx
搜索1长至8个字节。
使用ColumnFamily来映射密钥。
https://stackoverflow.com/questions/38244095
复制相似问题