我对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()),但它的行为方式完全相同。
如何按时间降序记录存储和检索?
答案 0 :(得分:3)
聚类顺序是指分区内的排序,即相同的ID。因此,如果您插入多个具有不同raised
值的行并进行查询,您会看到它们按降序返回。
您看到的顺序是ID的顺序。如您所见,这些基本上是随机的。此顺序是分区顺序,即按ID的散列排序。
您无法更改此顺序,因此无法按时间顺序读取所有分区。您只能在每个分区内订购。