【问题标题】:Storing time ranges in cassandra在 cassandra 中存储时间范围
【发布时间】:2011-01-12 09:21:24
【问题描述】:

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

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

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

您能否为 Cassandra 中的数据提出一种结构,以使我能够有效地执行此类查询?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    高效建模是一件异常困难的事情。

    我认为使用 Cassandra 的二级索引(以及目前仍需要的虚拟索引值)是您的最佳选择。您需要为每个事件使用一行,至少包含三列:“start”、“end”和“dummy”。在其中的每一个上创建一个二级索引。前两个可以是 LongType,最后一个可以是 BytesType。有关详细信息,请参阅this post on using secondary indexes。由于您必须在至少一列上使用 EQ 表达式进行二级索引查询(我提到的不幸的要求),所以 EQ 将处于“虚拟”状态,可以始终设置为 0。(这意味着 EQ 索引表达式将匹配每一行,基本上是无操作的。)您可以将其余的事件数据存储在开始、结束和虚拟旁边的行中。

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

    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 执行范围切片。这将在开始时间之后扫描每一行,并且只返回那些列在完成时间之前的行。效率不是很高,而且你必须做一个大的 multiget 等。内置的二级索引方法更好,因为节点只会索引本地数据,并且大部分样板索引代码都会为你处理。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 2011-09-08
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多