0

使用 com.netflix.astyanax,我为给定行添加条目,如下所示:

final ColumnListMutation<String> columnList = m.withRow(columnFamily, key);
columnList.putEmptyColumn(columnName);

后来我检索了我的所有列:

  final OperationResult<ColumnList<String>> operationResult = keyspace
          .prepareQuery(columnFamily).getKey(key).execute();
  operationResult.getResult().getColumnNames();

以下正确返回了我添加的所有列,但这些列没有按照它们在数据库中输入的时间进行排序。由于每列都有与之关联的时间戳,因此应该有一种方法可以做到这一点,但我没有看到。在那儿?

注意:如果没有,我可以随时将上面的代码更改为:

columnList.putColumn(ip,new Date());

然后检索列值,对它们进行相应的排序,但这似乎很麻烦、效率低下和愚蠢,因为每列都已经有一个时间戳。

4

2 回答 2

0

我从 PlayOrm 知道,如果您执行列切片,它会按顺序返回这些切片。事实上,playorm 使用它确实在分区中启用了 S-SQL,并且基本上根据请求的方式对按顺序或反向顺序返回的列切片进行批处理。您可能想要从 0 到 MAXLONG 进行列切片。

我不确定是否会获得这一行。我没试过。

哦,PlayOrm 只是 astyanax 之上的一个映射层,虽然不是真正的关系,而且更多的是 noSql'ish,正如它的模式页面所展示的那样

http://buffalosw.com/wiki/Patterns-Page/

于 2013-03-08T13:33:50.120 回答
0

Cassandra 永远不会按“插入顺序”对您的列进行排序。

列总是按最低的顺序排列。它还取决于 cassandra 如何解释您的列名。您可以使用定义列族时设置的比较器来定义解释。

从你给出的看起来你使用字符串时间戳值。如果您只是将时间戳序列化为例如“123141”和“231”,请注意使用UTF8Type比较器“231”>“123131”。

更好的方法:使用基于时间的 UUID 作为列名,正如 Cassandra 中时间序列数据的许多示例所建议的那样。然后你可以使用UUIDType比较器。

 CREATE COLUMN FAMILY timeseries_data
 WITH comparator = UUIDType
 AND key_validation_class=UTF8Type;
于 2013-08-25T17:03:13.143 回答