[英]How get random key-value from hazelcast map
我試圖從 Map 像這樣
IMap<Integer, Integer> workWaitTasks = hazelcastInstance.getMap(WORK_WAIT_TASKS);
collectionTask = Collections.singleton(workWaitTasks.values().stream()
.skip(workWaitTasks.isEmpty() ? 0 : new Random().nextInt(workWaitTasks.size()))
.findFirst()
.get());
int taskId = collectionTask.iterator().next();
但我認為最好的方法是使用謂詞
我讀了這個https://docs.hazelcast.com/imdg/4.2/query/how-distributed-query-works.html#querying-with-sql-like-predicates不幸的是這對我沒有幫助
我找不到辦法做到這一點
在 sql 中是這樣的
SELECT column FROM table
ORDER BY RAND()
LIMIT 1
如何在榛樹中做出正確的謂詞?
你能舉個例子嗎? 請幫幫我
我認為使用公共 API 沒有直接有效的方法來做到這一點。 一種選擇是使用 Jet:
IMap<Object, Object> sourceMap = instance.getMap("table");
IList<Object> targetList = instance.getList("result");
int samplingFactor = sourceMap.size() / 10;
Pipeline p = Pipeline.create();
p.readFrom(Sources.map(sourceMap))
.filter(item -> item.getKey().hashCode() % samplingFactor == ThreadLocalRandom.current().nextInt(samplingFactor))
.writeTo(Sinks.list(targetList));
instance.newJob(p).join();
上面的代碼應該在結果列表中添加大約 10 個元素,從中很容易獲得一個隨機條目,但它也可能以一個空列表結束 - 您可以嘗試增加samplingFactor
中的乘數以獲得令人滿意的獲得一些元素的概率結果而不必重新運行作業。
使用帶有自定義聚合器的聚合( IMap.aggregate
)也可以做到這一點,一些同事可能會提供答案:-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.