1

我对 Cassandra 很陌生,我创建了一个像这样的表:

CREATE TABLE IF NOT EXISTS notifications (
  id uuid,
  raised timeuuid,
  recorded timeuuid,
  customer varchar,
  region varchar,
  location varchar,
  operator varchar,
  till varchar,
  receipt_id varchar,
  value decimal,
  details text,
  is_refund boolean,
  has_promos boolean,
  utc_offset int,
  frame_count int,
  expecting_video boolean,
  PRIMARY KEY (id, raised)
) WITH CLUSTERING ORDER BY (raised desc);

然后从 DataStax .NET Cassandra 适配器插入 1,000 行,如下所示:

for (var i = 0; i < 1000; i++)
{
                    var id = Guid.NewGuid();
                    var now = DateTime.Now;

                    var insertNotif = session.Prepare(@"
                    INSERT INTO notifications 
                    (id,customer,region,location,operator,till,receipt_id,value,details,is_refund,has_promos,raised,recorded,utc_offset,frame_count,expecting_video)
                    VALUES (?,?,?,?,?,?,?,?,?,?,?,now(),now(),?,?,?)");
                    var insertNotifStatement = insertNotif.Bind(id, "cust1", "reg1", "loc1", "tomm", "london", i.ToString(), i % 10.99D, "DATA_HERE", false, true, (int)TimeZone.CurrentTimeZone.GetUtcOffset(now).TotalMinutes, 0, false);

                    session.Execute(insertNotifStatement);
                    Thread.Sleep(10);
}

我期望发生的是所有记录都将根据raised列按时间降序存储。当我使用 CQLSH 检查数据时,它似乎是随机顺序的:

cqlsh:my_keyspace> select dateOf(raised) from notifications limit 5;

 dateOf(raised)
--------------------------------------
 2014-06-03 11:12:45GMT Daylight Time
 2014-06-03 11:12:48GMT Daylight Time
 2014-06-03 11:12:56GMT Daylight Time
 2014-06-03 11:12:32GMT Daylight Time
 2014-06-03 11:12:34GMT Daylight Time

(5 rows)

我做错了什么吗?顺便说一句,我也尝试设置raised为时间戳列并期望相同的行为(但我从 .NET 而不是 now() 传入 DateTimes),但它的行为方式完全相同。

如何获取我的记录存储并按时间降序检索?

4

1 回答 1

3

聚类顺序是指分区内的顺序,即对于相同的 ID。因此,如果您插入具有不同raised值的多行并进行查询,您会看到它们以降序返回。

您看到的顺序是 ID 的顺序。正如您所观察到的,这些基本上是随机的。此顺序是分区顺序,即按 ID 的哈希排序。

您无法更改此顺序,因此您无法按时间顺序读取所有分区。您只能在每个分区内订购。

于 2014-06-04T19:44:35.947 回答