2016-03-01 121 views
1

我有这个表:卡桑德拉秩序和聚集键

CREATE TABLE custumer_events_service.events_by_websiteId_time(
    "event_id" text, 
    "currentTime" timestamp, 
    "websiteId" varchar, 

    OTHER COLUMNS ... 

    PRIMARY KEY(event_id, websiteId, currentTime) 
) 

在这种情况下,我会得到通过currentime有序当我执行此查询10000行:

SELECT * FROM events_by_websiteid_time WHERE websiteid='xxxx' LIMIT 10000 ALLOW FILTERING; 

还是我要在末尾添加WITH CLUSTERING ORDER BY (currentTime DESC);

回答

3

Cassandra只能在分区内执行排序顺序。由于您使用ALLOW FILTERING以避免必须提供分区密钥(event_id),因此您的结果集将按每个event_id的散列标记值排序,然后由websiteidcurrentTime排序。

要让您的结果按照currentTime排序,您需要创建一个新的查询表或更改现有表的PRIMARY KEY定义(也可能是CLUSTERING ORDER)。如果你决定创建一个新的查询表,它必须是这个样子:

CREATE TABLE custumer_events_service.events_by_websiteId_time_eventid(
    event_id text, 
    currentTime timestamp, 
    websiteId varchar, 

OTHER COLUMNS ... 

    PRIMARY KEY (websiteid,currentTime,event_id)) 
WITH CLUSTERING ORDER BY (currentTime DESC, event_id ASC); 

这将使该查询:

SELECT * FROM events_by_websiteid_time_eventid WHERE websiteid='xxxx' LIMIT 10000; 

...为你所期望的工作。

+0

+1感谢您的回答Aron(再一次;-)),第一个解决方案(使用CLUSTERING ORDER)有什么缺点?在第二种解决方案中,我不会冒我的群集失衡的风险,因为我通过websiteId有一个非等价的事件分布。 – farhawa

+0

@farhawa第一个解决方案的缺点是涉及将数据复制到新的查询表中。但是,如果您需要为'websiteid'和'event_id'键入查询,那么您可能需要两个表......交易磁盘以提高性能。至于第二种解决方案中的不平衡性,如果它有很大的差异,那么添加额外的“存储桶”来帮助分割数据(如日或月)或其他适合您的用例的其他内容是有意义的。 – Aaron

+0

当我学习cassandra时,我发布了一个新问题http://stackoverflow.com/questions/35880249/cassandra-the-same-query-work-with-cql-but-not-with-python-driver can you看一看?提前致谢 – farhawa