如何按日期范围查询Cassandra

时间:2010-08-20 21:29:30

标签: nosql cassandra

我有一个Cassandra ColumnFamily(0.6.4),它将有来自用户的新条目。我想查询Cassandra的新条目,以便我可以在另一个系统中处理这些数据。

我的感觉是我可以使用TimeUUIDType作为我的条目的密钥,然后查询KeyRange,它以“”作为startKey或者lastStartKey开始。这是正确的方法吗?

get_range_slice如何实际创建范围?是否必须知道密钥的数据类型?任何地方都没有声明密钥的数据类型。在storage_conf.xml文件中,您声明列的类型,但不声明键的类型。假设密钥与列的类型相同吗?或者它会做一些神奇的嗅探猜测?

我也看过人们将TimeUUIDType存储在列中的参考实现。然而,这似乎有规模问题,因为这个特定的密钥会变得“热”,因为每次更改都必须更新它。

在这种情况下,任何指针都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

排序数据时,只有列密钥很重要。存储的数据无关紧要,也不是自动生成的时间戳。 CompareWith属性在这里很重要。如果将CompareWith设置为UTF8Type,则键将被解释为UTF8Types。如果将CompareWith设置为TimeUUIDType,则键将自动解释为时间戳。您不必指定数据类型。查看此页面上的SlicePredicate和SliceRange定义http://wiki.apache.org/cassandra/API这是一个很好的起点。此外,您可能会发现这篇文章很有用http://www.sodeso.nl/?p=80在第三部分中他会讨论切片的查询等等。

答案 1 :(得分:1)

道格

如果使用订单保留分区程序,写入单个列系列有时可能会产生热点,但如果使用默认的随机分区程序则不会写入(除非用户的子集创建的数据远远超过所有其他用户! )。

如果按时间对进行排序(使用Order-Preserving Partitioner),那么您可能更有可能创建热点,因为您将按顺序添加行,并且单个节点将负责对于键空间的每个范围。

答案 2 :(得分:1)

列和键可以是任何类型,因为行键只是第一列。 实际上,集群是一个循环的散列密钥环,分区器对密钥进行散列以分布在集群周围。

请注意将日期用作行键,因为即使默认randompartitioner的随机化也是有限的,您最终可能会使数据混乱。

更重要的是,如果该日期发生变化,则必须删除上一行,因为您只能在C *中进行插入。

以下是我们所知道的:

  • 切片范围是一行中具有起始值和结束值的列范围,当列按顺序排列时,它主要用于宽行。 CF中定义的已知列名称已编制索引,因此可以检索它们指定名称。
  • 关键切片,是与Cassandra
  • 返回的切片列范围相关联的关键字
  • where子句的等价物使用二级索引,您可以在那里使用不等式运算符,但是语句中必须至少有一个equals子句(另请参阅https://issues.apache.org/jira/browse/CASSANDRA-1599)。
  • 对于随机分区程序,使用键范围是无效的,因为键的MD5哈希值不会保持词汇顺序。

您要使用的是使用宽行的基于列族的索引: CompositeType(TimeUUID | UserID) 为了使其不会变热,请添加第一个有意义的密钥(“分片密钥”),该密钥将跨节点(例如用户类型或区域)分割数据。

在Cassandra中拥有的数据不是必需的,这不是一个问题,它是如何设计的,所以你必须要问自己“我需要查询什么”,然后为它设计一个列族而不是试图适应一切在一个CF中就像你在RDBMS中那样做。