4

我们正在尝试基于以下结构(例如日期时间、日期时间、整数)从 CF 创建/查询信息

e.g.
03-22-2012 10.00, 03-22-2012 10.30 100
03-22-2012 10.30, 03-22-2012 11.00 50
03-22-2012 11.00, 03-22-2012 11.30 200

如何在 Cassandra 中对上述结构进行建模并通过 Hector 执行以下查询。

select * from <CF> where datetime1 > 03-22-2012 10.00 and datetime2 < 03-22-2012 10.30
select * from <CF> where datetime1 > 03-22-2012 10.00 and datetime2 < 03-22-2012 11.00
select * from <CF> where datetime = 03-22-2012 (i.e. for the entire day)
4

2 回答 2

2

这是在 Cassandra 中处理日期和时间的一个很好的介绍:Cassandra 的基本时间序列

简而言之,使用时间戳(或 v1 UUID)作为列名并将比较器设置为 LongType(或 TimeUUIDType),以便按时间顺序对列进行排序。然后很容易获得两个时间点之间的数据片段。

您的问题对此并不完全清楚,但是如果您想获取在一天中给定时间范围内发生的所有事件,而不管日期如何,那么您将需要以不同的方式构建数据。在这种情况下,列名可能是 CompositeType(LongType, AsciiType),其中第一个组成部分是普通的时间戳 mod 86400(一天中的秒数),第二个组成部分是日期或随时间变化的其他内容,像一个完整的时间戳。在这种情况下,您还可能希望拆分该行,也许每个小时都专用一个不同的行。

于 2012-03-22T05:16:10.907 回答
0

不幸的是,在 Cassandra 中仅使用一个列族是无法轻松做到这一点的。问题是您希望 cassandra 根据两个不同的事物进行排序:datetime1 和 datetime2。

显而易见的结构是让您的列是 Composite(TimeUUID,TimeUUID,Integer)的复合类型。在这种情况下,它们将按 datetime1、datetime2、integer 排序。

但是您将始终根据 datetime1 而不是 datetime2 获得排序(尽管如果两个条目具有相同的 datetime1 那么它将仅根据 datetime2 对这些条目进行排序)。

一种可能的解决方法是让两个列族具有重复数据(或者实际上每个逻辑行有两行)。插入数据的一行 (datetime1:datetime2:integer) 和插入数据的另一行 (datetime2:datetime1:integer)。然后,您可以对这两行执行 multigetslice 操作,并在将数据交给调用者之前组合数据:

final MultigetSliceQuery<String, Composite, String> query = HFactory.createMultigetSliceQuery(keyspace,
    StringSerializer.get(),
    CompositeSerializer.get(),
    StringSerializer.get());

query.setColumnFamily("myColumnFamily");
startQuery.setKeys("myRow.arrangedByDateTime1", "myRow.arrangedByDateTime2");
startQuery.setRange(new Composite(startTime), new Composite(endTime), false, Integer.MAX_VALUE);

final QueryResult<Rows<String,Composite,String>> queryResult = query.execute();
final Rows<String,Composite,String> rows = queryResult.get();
于 2012-03-22T15:26:57.427 回答