gpt4 book ai didi

scala - 保留 Aerospike CDT 列表的 MAX 值

转载 作者:行者123 更新时间:2023-12-04 12:09:04 25 4
gpt4 key购买 nike

语境
考虑有一个元组流 (string, timestamp) ,目标是让垃圾箱包含 Map最小 收到每个字符串的时间戳。
另一个限制是此 Map 的更新将是原子的。
对于此输入示例:

("a", 1)
("b", 2)
("a", 3)
预期输出: Map("a" -> 1, "b" -> 2)没有最大时间戳 3 .
我选择的当前实现是使用列表的 CDT 来保存时间戳,所以我的结果是 Map("a" -> ArrayList(1), "b" -> ArrayList(2))如下:
private val boundedAndOrderedListPolicy = new ListPolicy(ListOrder.ORDERED, ListWriteFlags.INSERT_BOUNDED)

private def bundleContext(str: String) =
CTX.mapKeyCreate(Value.get(str), MapOrder.UNORDERED)

private def buildInitTimestampOp(tuple: (String, Long)): List[Operation] = {
// having these two ops together assure that the size of the list is always 1
val str = tuple._1
val timestamp = tuple._2
val bundleCtx: CTX = bundleContext(str)
List(
ListOperation.append(boundedAndOrderedListPolicy, initBin, Value.get(timestamp), bundleCtx),
ListOperation.removeByRankRange(initBin, 1, ListReturnType.NONE, bundleCtx), // keep the first element of the order list - earliest time
)
}

这按预期工作。但是,如果您有更好的方法在没有列表的情况下以原子方式实现这一目标 - 我很乐意听到它。
我的问题
对我不起作用的是保留 最大时间戳 为每个输入 str 接收。对于上面的示例,所需的结果应该是 Map("a" -> ArrayList(3), "b" -> ArrayList(2)) .我的实现尝试是:
private def buildLastSeenTimestampOp(tuple: (String, Long)): List[Operation] = {
// having these two ops together assure that the size of the list is always 1
val str = tuple._1
val timestamp = tuple._2
val bundleCtx: CTX = bundleContext(str)
List(
ListOperation.append(boundedAndOrderedListPolicy, lastSeenBin, Value.get(timestamp), bundleCtx),
ListOperation.removeByRankRange(lastSeenBin, 1, ListReturnType.NONE | ListReturnType.REVERSE_RANK, bundleCtx), // keep the last element of the ordered list - last time
)
}
知道为什么它不起作用吗?

最佳答案

所以,我已经解决了:

private def buildLastSeenTimestampOp(tuple: (String, Long)): List[Operation] = {
// having these two ops together assure that the size of the list is always 1
val str = tuple._1
val timestamp = tuple._2
val bundleCtx: CTX = bundleContext(str)
List(
ListOperation.append(boundedAndOrderedListPolicy, lastSeenBin, Value.get(command.timestamp.getMillis), bundleCtx),
ListOperation.removeByRankRange(lastSeenBin, -1, ListReturnType.NONE | ListReturnType.INVERTED, bundleCtx), // keep the last element of the ordered list - last time
)
}
按升序处理 Rank/Index(removeByIndexRange 用于索引)时 -1 代表最大排名/指数 .
使用 ListReturnType.INVERTED保留由初始 rank 选择的范围(或本例中的元素)/ index直到 count - 通过删除不在选定范围内的列表中的所有元素。

关于scala - 保留 Aerospike CDT 列表的 MAX 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68422105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com