这是使用 Astyanax 食谱中 AllRowsReader 类的示例:
reader = new AllRowsReader.Builder<>(keyspace, columnFamily)
.withPageSize(1000)
.withConcurrencyLevel(10)
.withPartitioner(null)
.withConsistencyLevel(ConsistencyLevel.CL_ONE)
.withIncludeEmptyRows(false)
.withTokenRange(startToken, endToken)
.forEachRow(new Function<Row<String, String>, Boolean>() {
@Override
public Boolean apply(@Nullable Row<String, String> row) {
startToken = keyspace.getPartitioner().getTokenForKey(row.getRawKey());
// some other statements
return true;
}
})
.build();
reader.call();
,其中
startToken = keyspace.getPartitioner().getMinToken();
lastToken = keyspace.getPartitioner().getMaxToken();
如果要运行 AllRowsReader 而不使用“ withTokenRange(startToken,endToken)”,那么一切正常。但是使用“ withTokenRange(startToken,endToken)”并不是在列族读取期间获取所有行。
AllRowsReader的源代码为:
if (this.concurrencyLevel != null || startToken != null|| endToken != null) {
List<TokenRange> tokens = partitioner.splitTokenRange(
startToken == null ? partitioner.getMinToken() : startToken,
endToken == null ? partitioner.getMinToken() : endToken,
this.concurrencyLevel == null ? 1 : this.concurrencyLevel);
for (TokenRange range : tokens) {
subtasks.add(makeTokenRangeTask(range.getStartToken(), range.getEndToken()));
}
}
稍后 partitioner.getMinToken()将恢复为 maxToken 。所以我不明白我的做法有什么不同?为什么带有 minToken / maxToken 的 AllRowsReader 与没有它们的 AllRowsReader 不同?
如果操作被终止,我会用最后一个 startToken 再次执行它(所以它必须是一个移位)。但在这种情况下,我看到之前有一些行被取出。这也让我感到困惑......
P.S。 Astyanax 自动确定 Murmur3Partitioner 。
感谢您的帮助。
答案 0 :(得分:0)
梅德, 将令牌范围视为一个响铃,因为圆圈完成开始将等于结束。为什么在astyanax代码中设置相同的标记为min和max。
startToken == null ? partitioner.getMinToken() : startToken,
endToken == null ? partitioner.getMinToken() : endToken
我希望这能澄清你的答案。让我知道你是否有疑问