【问题标题】:How get random key-value from hazelcast map如何从榛树地图中获取随机键值
【发布时间】:2021-08-14 23:17:27
【问题描述】:

我试图像这样从地图中获取随机元素

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

如何在 hazelcast 中做出正确的谓词?

你能举个例子吗?请帮帮我

【问题讨论】:

    标签: java hazelcast hazelcast-imap


    【解决方案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) 也可以做到这一点,一些同事可能会提供答案:-)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2020-07-17
      • 2015-10-12
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      相关资源
      最近更新 更多