Cassandra订购了范围查询的结果

时间:2016-02-10 08:47:36

标签: cassandra cql date-range

我有下表:

create table tweets_by_hashtags(
    hashtag text,
    tweet_id text,
    tweet_posted_time timestamp,
    retweet_count int,
    body text,
    primary key(hashtag, tweet_id)
 )

我想执行以下查询;我需要通过retweet_count desc

订购结果
select 
    * 
from 
    tweets_by_hashtags 
where 
    hashtag = 'some_hashtag' and
    tweet_posted_time >= 'from_time' and
    tweet_posted_time < 'to_time'  

请帮我设计主/分区/群集密钥。

1 个答案:

答案 0 :(得分:1)

由于您需要按标签对数据进行分区并按时间排序(您正在进行范围查询,因此您需要知道某些推文发生的时间),您的表应该像这样创建:

create table tweets_by_hashtags(
    hashtag text,
    tweet_id text,
    tweet_posted_time timestamp,
    retweet_count int,
    body text,
    primary key((hashtag), tweet_posted_time, tweet_id)
 )

其中hashtag是分区键,推文首先按时间聚类(按时间排序,启用范围查询),并添加tweet_id以获得唯一性(如果两条推文在同一时间发生,则需要区分他们)。

这将启用您所建议的选择查询,您需要在某些开始和结束时间之间通过主题标签发送推文。

至于问题的其他部分,我看到两种可能的解决方案:

<强> 1。申请级别的订单

当您提取推文列表时,您可以循环浏览列表并按转推计数进行排序,这样您就可以在需要的时间内订购推文。

<强> 2。固定时间段

如果您需要解决方案,即每日推文,每小时推文或其他内容,并且您可以跳过查询中的范围标准,则可以使用由主题标签和时间分辨率组成的复合主键创建表,并使用转发计数作为群集键。

create table hourly_tweets_by_hashtags(
        hashtag text,
        tweet_id text,
        tweet_posted_time timestamp,
        tweet_posted_date text,
        tweet_posted_hour int,
        retweet_count int,
        body text,
        primary key((tweet_posted_date, tweet_posted_hour, hashtag), retweet_count, tweet_id)
     ) WITH CLUSTERING ORDER BY (retweet_count DESC)

现在,您的复合主键由日期,小时和标签组成,推文按retweet_count排序。由于唯一性,再次添加tweet_id

现在你可以这样查询:

select 
    * 
from 
    hourly_tweets_by_hashtags 
where 
    hashtag = 'some_hashtag' and
    tweet_posted_date = '22/01/2016' and
    tweet_posted_hour = 16;

此查询将返回retweet_count订购的16h特定日期的所有推文。添加了聚类顺序以将大多数转发放在最上面。