如何通过ID或日期在Cassandra中选择数据?

时间:2018-04-09 21:09:46

标签: cassandra

我有一个非常简单的数据表。但是在阅读了很多互联网上的例子后,我仍然越来越困惑如何解决以下问题:

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中的表定义应该是什么样的,以便我可以执行这些选择?

2 个答案:

答案 0 :(得分:1)

要实现两个查询,您需要两个表。 第一个看起来像:

CREATE TABLE documents (
    uid text,
    created text,
    data text,
    PRIMARY KEY (uid));

并使用以下代码检索数据:SELECT * FROM documents WHERE uid='xxxx-yyyy-zzzzz'当然,uid必须是唯一的。您可能想要考虑uuid数据类型(而不是文本)

第二个更精致。如果将分区设置为完整日期,则无法进行范围查询,因为范围查询仅在群集列上可用。因此,您需要找到分区键的最佳位置,以便:

  1. 确保单个分区不会太大(最大100MB, 否则你会遇到麻烦)
  2. 满足您的查询要求。
  3. 举个例子:

    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;

在扫描所有分区时,应谨慎使用允许过滤。如果我们必须创建一个以日期为主键的单独表,如果在同一秒插入许多文档,则会变得棘手。群集顺序最适合需要按时间对给定用户的文档进行排序的要求。