【问题标题】:Cassandra CLUSTERING ORDER BY not doing what I'd expectCassandra 集群命令不做我期望的事情
【发布时间】:2014-07-23 15:21:17
【问题描述】:

我对 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),但它的行为方式完全相同。

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

【问题讨论】:

  • order by 仅在分区键受 eq 或 in.. 限制时才支持。
  • 我没有使用 ORDER BY,由于架构中定义的聚类顺序,我希望记录按日期降序存储。通过查询数据,我期望数据按照聚类顺序定义的顺序返回。

标签: database cassandra cql cql3 cqlsh


【解决方案1】:

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

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

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

【讨论】:

  • 好信息谢谢,那么我该如何按日期 desc 顺序检索所有通知?
  • 你不能,除非你把它们都放在同一个分区中。但是你没有得到任何可扩展性。如果您需要读入所有数据,可以使用 Hadoop 或 Shark。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
相关资源
最近更新 更多