当前位置: 首页 > 知识库问答 >
问题:

如何从hazelcast映射中获取随机键值

李博达
2023-03-14

我试着从地图上得到这样一个随机元素

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中生成正确的谓词?

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

共有1个答案

谢海阳
2023-03-14

我认为没有直接有效的方法可以使用公共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)和自定义聚合器也可以做到这一点,一些同事可能会提供答案:-)。

 类似资料:
  • 问题内容: 我有一个数组叫做 我需要从该数组中获取一个随机值并将其存储在变量中,我该怎么做? 问题答案: 您还可以执行以下操作: 当您有关联数组时,这就是这样做的方法。

  • 问题内容: 可以说我有一个单词列表,我想创建一个将新列表的大小作为参数并返回新列表的方法。我如何从原始sourceList中获得随机单词? 那么,如何以及在哪里可以使用我的随机数? 问题答案: 我找到了适当的解决方案。Random提供了一些返回流的方法。例如ints(size)会创建一个随机整数流。

  • 我有多个数组映射。 我想从多个地图中获取重复地图键的列表。 例如 除了遍历所有地图键,检查集合是否包含键,如果不将键添加到集合中,我想不出任何更干净的方法。有没有办法通过streams来实现这一点?

  • 我正在开发Spring Boot应用程序与Spring Data JPA和H2数据库。我使用的是sping-data-jpa。当我使用ManyTo很多映射器类来获取另一个类的数据时。但是我发现它是NULL。 代码在github上 书班 著者班 测试中的测试代码捕捉器。班 我的代码有错误吗?或者其他方式? 非常感谢。

  • Hazelcast数据存储 如何通过传递any键获取值(John)。。 在Hazelcast这可能吗...?

  • 如何将侦听器设置为一个映射,该映射的键有一个复杂的对象,并且我只想侦听具有特定键参数值的条目发生的更改。 例如,我有一个类似于此的代码: 但当一个包含“EN”语言的键的条目被更新时,我的回调函数不会被调用。所以我假设我的谓词是错误的。