gpt4 book ai didi

cassandra - 在 cassandra 中存储时间范围

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

我正在寻找一种好方法来存储与时间范围相关的数据,以便以后能够有效地检索它。

每条数据可以简化为(start time, end time, value) 。我稍后需要检索 (x, y) 内的所有条目范围。在 SQL 中,查询类似于

SELECT value FROM data WHERE starttime <= x AND endtime >= y

您能否建议 Cassandra 中的数据结构,使我能够有效地执行此类查询?

最佳答案

要有效地建模这是一件异常困难的事情。

我认为使用 Cassandra 的二级索引(以及不幸的是目前仍然需要的虚拟索引值)是您的最佳选择。每个事件需要使用一行并至少包含三列:“开始”、“结束”和“虚拟”。对每个索引创建一个二级索引。前两个可以是 LongType,最后一个可以是 BytesType。请参阅this post on using secondary indexes更多细节。由于您必须在至少一列上使用 EQ 表达式来进行二级索引查询(我提到的不幸的要求),因此 EQ 将位于“虚拟”上,该值始终可以设置为 0。(这意味着 EQ 索引表达式将匹配每一行,本质上是无操作。)您可以将其余事件数据与开始、结束和虚拟一起存储在该行中。

pycassa ,一个 Python Cassandra 客户端,您的查询将如下所示:

from pycassa.index import *
start_time = 12312312000
end_time = 12312312300
start_exp = create_index_expression('start', start_time, GT)
end_exp = create_index_expression('end', end_time, LT)
dummy_exp = create_index_expression('dummy', 0, EQ)
clause = create_index_clause([start_exp, end_exp, dummy_exp], count=1000)
for result in entries.get_indexed_slices(clause):
# do stuff with result

其他客户端应该也有类似的东西。

我首先考虑的替代方案涉及 OrderPreservingPartitioner,这几乎总是一件坏事。对于索引,您可以使用开始时间作为行键,使用结束时间作为列名。然后,您可以使用 start_key=start_time 和 column_finish=finish_time 执行范围切片。这将扫描开始时间之后的每一行,并且仅返回那些在完成时间之前具有列的行。效率不太高,而且您必须执行大型多重获取等操作。内置二级索引方法更好,因为节点只会索引本地数据,并且大多数样板索引代码都会为您处理。

关于cassandra - 在 cassandra 中存储时间范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4667040/

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