我有一个非常简单的数据表。但是在阅读了很多互联网上的例子后,我仍然越来越困惑如何解决以下问题:
1)表
我的数据表看起来像这样(没有定义primayr键,因为这是我的理解问题):
CREATE TABLE documents (
uid text,
created text,
data text
}
现在我的目标是采用不同的方式来选择数据。
2)按UID选择:
SELECT * FROM documents
WHERE uid = ‘xxxx-yyyyy-zzzz’
3)按日期限制选择
SELECT * FROM documents
WHERE created >= ‘2015-06-05’
所以我的问题是:
我在Cassandra中的表定义应该是什么样的,以便我可以执行这些选择?
答案 0 :(得分:1)
要实现两个查询,您需要两个表。 第一个看起来像:
CREATE TABLE documents (
uid text,
created text,
data text,
PRIMARY KEY (uid));
并使用以下代码检索数据:SELECT * FROM documents WHERE uid='xxxx-yyyy-zzzzz'
当然,uid必须是唯一的。您可能想要考虑uuid数据类型(而不是文本)
第二个更精致。如果将分区设置为完整日期,则无法进行范围查询,因为范围查询仅在群集列上可用。因此,您需要找到分区键的最佳位置,以便:
举个例子:
CREATE TABLE documents_by_date (
year int,
month int,
day int,
uid text,
data text,
PRIMARY KEY ((year, month), day, uid);
如果在一天之内,您没有太多文档(因此您的分区不会增长太多),这样可以正常工作。这允许您创建查询,例如:SELECT * FROM documents_by_date WHERE year=2018 and month=12 and day>=6 and day<=24;
如果您需要跨多个月发出范围查询,则需要发出多个查询。
如果由于data
字段导致分区过大,则需要将其从documents_by_date中删除。并且使用documents
表来检索数据,给定您从documents_by_date
返回的uid。
如果您的分区仍然太大,则需要在hour
的分区键中添加documents_by_date
。
总的来说,这不是一个简单的请求,在定义分区密钥时,您需要为自己找到合适的平衡点。
如果延迟不是一个大问题,另一种方法是使用stratio lucene cassandra插件,并为你的日期编制索引。
答案 1 :(得分:1)
问题没有说明您的数据将如何与用户和创建时间相关。但是,由于它是一个文档,我假设一个用户将在一个&#34;创建&#34;创建一个文档。时间。
以下是您可以使用的表格定义。
CREATE TABLE documents (
uid text,
created text,
data text
PRIMARY KEY (uid, created)
) WITH CLUSTERING ORDER BY (created DESC);
WITH CLUSTERING ORDER BY(创建的DESC)可以帮助您获取为给定用户创建的数据顺序。
对于您的第一个要求,您可以查询如下所示。
SELECT * FROM documents WHERE uid = 'SEARCH_UID';
对于您的第二个要求,您可以查询如下所示
SELECT * FROM documents WHERE created > '2018-04-10 11:32:00' ALLOW FILTERING;
在扫描所有分区时,应谨慎使用允许过滤。如果我们必须创建一个以日期为主键的单独表,如果在同一秒插入许多文档,则会变得棘手。群集顺序最适合需要按时间对给定用户的文档进行排序的要求。