Cassandra CLUSTERING ORDER不做我期望的事

时间:2014-06-03 10:20:18

标签: database cassandra cql cql3 cqlsh

我对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传递DateTimes而不是now()),但它的行为方式完全相同。

如何按时间降序记录存储和检索

1 个答案:

答案 0 :(得分:3)

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

您看到的顺序是ID的顺序。如您所见,这些基本上是随机的。此顺序是分区顺序,即按ID的散列排序。

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