我有下表:
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'
请帮我设计主/分区/群集密钥。
答案 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特定日期的所有推文。添加了聚类顺序以将大多数转发放在最上面。