如何按日期范围查询Cassandra

如何按日期范围查询Cassandra

问题描述:

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

我的感觉是,我可以使用TimeUUIDType作为我的条目的关键字,然后查询以“”作为startKey或以lastStartKey开头的KeyRange。这是正确的方法吗?

get_range_slice如何实际创建范围?它不需要知道密钥的数据类型吗?没有任何关键字的数据类型的声明。在storage_conf.xml文件中,声明列的类型,但不是键的类型。假设关键字与列的类型相同?还是它做了一些神奇的嗅探猜测?

我也见过参考实现,其中人们将TimeUUIDType存储在列中。然而,这似乎有规模问题,因为这个特定的关键会变得“热”,因为每一个变化都需要更新它。

在这种情况下,任何指针将不胜感激。

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

+0

我知道你可以使用列键进行排序。但是,如果我要为集合中的每个项目编写一个时间戳列,我会不断写入一个列族,这会创建一个热点。 – Doug 2010-09-07 22:36:21

+0

我还没有理解你的评论。你能详细说明一下吗?就列键而言,Cassandra一旦存储它,就会根据键(或Cassandra约定中的'name')自动对整列(超列)进行排序。 另外,如果你可以详细说明你的用例,它会帮助:) – 2010-09-08 03:37:24

道格,

写单个列族有时可以创建一个热点,如果您使用的是保序分区程序,但如果您使用的是默认的随机分区程序(除非用户的子集创建大大比所有其他用户更多的数据!)。

如果按时间排序的(使用保序分区程序),那么你可能更容易让人产生热点,因为你会被依次加入行和单个节点将负责的每个范围密钥空间。

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

但是要小心使用日期作为行键,因为即使默认randompartitioner的随机化也是有限的,最终可能会混淆数据。更重要的是,如果日期发生变化,您将不得不删除上一行,因为您只能在C *中执行插入操作。

这是我们所知道的:

  • 切片范围与起始值和结束值的行列的范围内,这是主要用于宽行的列进行排序。然而,在CF中定义的已知列名被索引,因此可以检索指定名称。
  • 一个关键切片,是与切片列区域相关联的密钥由卡桑德拉
  • 的等效WHERE子句使用次级索引,则可以使用不等式运营商那里,但是,必须有至少一等于子句中返回您的声明(另请参阅https://issues.apache.org/jira/browse/CASSANDRA-1599)。
  • 使用密钥范围对随机分区程序无效,因为密钥的MD5哈希不保留词法排序。

要使用什么是使用宽行一列家庭基于指数: 的CompositeType(TimeUUID |用户名) 为了这个不成为热时,放入第一个有意义的键(“片键”)这将分割跨节点的数据,如用户类型或区域。

在Cassandra中有更多的数据并不是问题,它是如何设计的,所以你必须问自己的是“我需要查询什么”,然后为它设计一个Column Family,而不是试图拟合就像你在RDBMS中做的一样。