我的数据存储格式为:
RowKey: a:b:c
=> ( counter=d:e:f:g, value=1)
where, a: Timestamp (Format : YYYYMMDDHH, HH varies from 00 - 23) b: encoded Url c: id (Varies from 0 - 9) d: string type e: floating value f: floating value g: integer type
我想要获取所有这些行(包含其列),其中url =来自整个列族的给定值,其中c是00 - 23.
如何在Java中完成(最好是使用Hector客户端)?
答案 0 :(得分:2)
这在卡桑德拉是不可能的。 CompositeKeys非常简单,基本上只是将单独的部分转换为一个键。因此,数据按照其密钥的顺序存储(和排序)在cassandra中,这就是它的检索方式。
您将只能对整个复合键(a:b:c)进行范围/切片查询,并且首先按a,然后按b,然后按c进行排序。如果您希望能够在c上进行范围查询,那么您需要使用c:a:b形式的复合密钥存储数据 - 在这种情况下,您将无法对a和b进行范围查询单独
这里有两个选项:
1)使用关系数据库(这里可能不是一个好的解决方案) 2)复制数据。所以你的数据有两行 - 一个是CompositeKey是a:b:c,另一行是CompositeKey是c:a:b(和第三个b:c:a,如果你需要做范围/切片查询排序仅在b)。对于这两行中的所有两行(/三行),数据本身都是相同的,您可以根据所需的查询搜索相应的行。不幸的是,这是Cassandra的缺点之一,但却是完成BigData模型所必需的。