我有一个Cassandra ColumnFamily(0.6.4),它将有来自用户的新条目。我想查询Cassandra的新条目,以便我可以在另一个系统中处理这些数据。
我的感觉是我可以使用TimeUUIDType作为我的条目的密钥,然后查询KeyRange,它以“”作为startKey或者lastStartKey开始。这是正确的方法吗?
get_range_slice如何实际创建范围?是否必须知道密钥的数据类型?任何地方都没有声明密钥的数据类型。在storage_conf.xml文件中,您声明列的类型,但不声明键的类型。假设密钥与列的类型相同吗?或者它会做一些神奇的嗅探猜测?
我也看过人们将TimeUUIDType存储在列中的参考实现。然而,这似乎有规模问题,因为这个特定的密钥会变得“热”,因为每次更改都必须更新它。
在这种情况下,任何指针都会受到赞赏。
答案 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 *中进行插入。
以下是我们所知道的:
您要使用的是使用宽行的基于列族的索引: CompositeType(TimeUUID | UserID) 为了使其不会变热,请添加第一个有意义的密钥(“分片密钥”),该密钥将跨节点(例如用户类型或区域)分割数据。
在Cassandra中拥有的数据不是必需的,这不是一个问题,它是如何设计的,所以你必须要问自己“我需要查询什么”,然后为它设计一个列族而不是试图适应一切在一个CF中就像你在RDBMS中那样做。