范围查询的cassandra的表定义语句?

时间:2015-10-21 21:36:22

标签: cassandra data-modeling cassandra-2.0

这是表格数据

video_id uuid
user_id timeuuid
added_year int
added_date timestamp
title text
description text

我想基于以下查询构建表

select * from video_by_year where added_year<2013;

创建表videos_by_year(

video_id uuid
user_id timeuuid
added_year int
added_date timestamp
title text
description text
PRIMARY KEY ((added_year) added_year)

);

注意:我使用added_year作为主键和群集键,我认为这是不正确的。

1 个答案:

答案 0 :(得分:1)

因此cassandra中数据建模的一个问题是第一个组件 - 分区键 - 必须使用“=”。如果你意识到cassandra正在做什么,它的原因很明显 - 它使用该值,哈希(md5或murmur3),并使用它来确定集群中哪些服务器拥有该分区。

因此,您不能使用不等式 - 它需要扫描群集中的每一行。

如果您需要在2013年之前添加视频,请考虑使用日期的某些部分作为分区键的系统,然后从每个日期“桶”中选择SELECT,您可以异步并行地执行这些操作。例如:

create table videos_by_year (
 video_id uuid
 user_id timeuuid
 added_date_bucket text
 added_date timestamp
 title text
 description text
 PRIMARY KEY ((added_date_bucket), added_date, video_id)
) ;

我将文本用于added_date_bucket,因此您可以使用“YYYY”或“YYYY-MM”或类似内容。请注意,根据您向系统添加视频的速度,您甚至可能需要“YYYY-MM-DD”或“YYYY-MM-DD-HH:ii:ss”,因为您将达到一些实际限制每桶百万个视频。

你可以聪明一点,让video_id成为timeuuid,然后你就可以在一列中添加add_date和video_id。