我们遇到了一个案例,我们想要从时间序列中检索数据。假设我们有基于时间的数据:[“t1-t2”:{data1},“t2-t3”:{data2},“t3-t4”:{dat3}]
使用上述类型的数据,我们希望在w.r.t时间查找确切的数据。例如,对于给定时间t1.5,数据必须作为data1,而对于t2.6,它应该作为data2。
为了解决上述问题,我们计划将数据存储在aerospike中的有序地图中,如下所述{“t1”:{data1},“t2”:{dat2},“t3”:{data3}}
当客户端要求t1.5时,我们必须返回data1。为实现这一目标,我们在服务器级实现了一个UDF,对给定输入的最接近和最低值进行二进制搜索(即t1.5),这将返回t1的值,即data1。
是否有更好的方法来实现相同的效果,因为它会在服务器级别为每个请求产生成本。即使是进行二进制搜索的UDF也需要将所有数据加载到内存中,我们可以避免它吗?
我们计划使用Aerospike。是否有更好的数据存储来处理此类查询..?
答案 0 :(得分:1)
大声思考......在t2上存储t1-t2,t2-t3是多余的。只需存储t1,从下一个键:值推断出t2。 {t1:data,t2:data,...} - 存储键排序(映射策略)您必须知道任何't1'和't2'之间的最大差异在MAPKEY上构建二级索引并键入numeric(这基本上是排序的大部分)在RAM中预先为你工作)搜索t-maxdiff和t + maxdiff之间的记录==>一组记录并将这些记录传递给您的UDF。在这几个记录子集上调用UDF以返回数据。这将是一个非常简单的UDF。注意:UDF在任何给定时间限制为128次并发执行。
答案 1 :(得分:1)
我不确定我是否理解这个问题。首先,您应该插入K-ordered map,其中键是时间戳(以毫秒或秒或其他分辨率为单位)。该值将是属性的映射。
要回到任何时间范围,您需要使用get_by_key_interval(例如Python客户端的Client.map_get_by_key_range
)。您可以弄清楚如何构建范围,但它只是两个时间戳之间的所有。
不要为此使用UDF,它不会像原生地图/列表操作那样执行或缩放。