如何设计nosql数据库以按时间戳选择数据顺序

pgky5nke  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(387)

总而言之,我想创建一个smack架构(spark、mesos、akka、cassandra和kafka)。我想做一个入口点,在这里我可以返回我的数据库中最后50个元素的add。这是我的数据库:

create table fireman
(
    uuid uuid primary key,
    date text,
    heartrate int,
    id text,
    location text,
    ratecommunication int,
    temperature int,
    time timestamp
);

我试着问这个:

SELECT * FROM scala_fireman.fireman WHERE temperature > 0 ORDER BY date LIMIT 5 ALLOW FILTERING ;

但我有个错误:

ORDER BY is only supported when the partition key is restricted by an EQ or an IN.

所以我的问题是如何选择得到我最后添加的n个元素?
我看到我可以通过这样做来订购table:

) WITH CLUSTERING ORDER BY (time DESC);

但要做到这一点,我需要改变时间作为主键,但一些数据是添加在同一时间,所以我不能设置为主键。

6jygbczu

6jygbczu1#

由于cassandra需要基于查询的建模方法,因此我们需要专门构建一个表来处理此查询:

SELECT * FROM scala_fireman.fireman 
WHERE temperature > 0 ORDER BY date LIMIT 5 ALLOW FILTERING;

你曾经问过吗 uuid ? 如果是这样,那么我们可以建立一个新表。如果没有,您将需要更改主键才能工作。在id列上构建单个主键严重限制了查询的灵活性(正如您所发现的)。
这是一个尽可能多的poc,目前我派出了100万消防员
这将是你的第一个障碍。cassandra每个分区只能支持20亿个单元,而且在那之前它会变得很慢。因此,我们要通过“计时”来限制每个分区的消防员事件数 month_bucket ,但您应该确定这是否真的适合您的业务需求。
下一步,你想 ORDER BY 日期,所以我们将使用它作为聚类键。实际上,作为 date 是一个文本字段,我们将使用 time 因为我肯定你不希望结果按ascii字母顺序返回。网上速成教育 ORDER BY 条款,是完全多余的。您只能对集群密钥的预定顺序强制执行它。它不应该出现在查询中。
注意:出现错误的原因是,排序顺序只能在数据分区内执行。它不能在结果集上强制执行。
另外,我看到你正在对 temperature . 通常情况下,这是一个坏主意(你需要 ALLOW FILTERING 在原始查询中)。但在一个分区内,情况应该不会太糟。只要那个隔板不太大。我们也会集中讨论的。
当然,在同一天,同一个温度下,有可能会有多个消防员参与一个事件,所以我们要补充一点 uuid 在最后强制唯一性。您的新主键应该如下所示:

PRIMARY KEY ((month_bucket),time,temperature,uuid))

因此,如果尝试以下表定义:

create table fireman_events_by_date_and_temp (
    uuid uuid,
    month_bucket int,
    date text,
    heartrate int,
    id text,
    location text,
    ratecommunication int,
    temperature int,
    time timestamp,
    PRIMARY KEY ((month_bucket),time,temperature,uuid))
    WITH CLUSTERING ORDER BY (time DESC, temperature ASC, uuid ASC);

现在,如果我加载一些数据并运行您的查询:

> SELECT time,temperature,heartrate,location
  FROM fireman_events_by_date_and_temp
  WHERE month_bucket=201904
  AND temperature > 0
  LIMIT 5
  ALLOW FILTERING;

 time                            | temperature | heartrate | location
---------------------------------+-------------+-----------+----------
 2019-04-30 13:40:03.253000+0000 |         644 |       144 |       SF
 2019-04-30 13:39:51.944000+0000 |         644 |       144 |       SF
 2019-04-30 13:39:39.859000+0000 |         644 |       144 |       SF
 2019-04-30 13:39:30.331000+0000 |         644 |       144 |       SF
 2019-04-30 13:39:15.945000+0000 |         644 |       144 |       NY

(5 rows)

通常,我不建议使用 ALLOW FILTERING . 但只要你在查询分区密钥( month_bucket )所有数据仍应由同一节点提供服务。
另外,我在2015年在cassandra中写了这篇关于结果集排序的文章,并在文章中演示了这些建模技术的使用。四年后它仍然非常相关(特别是对于这样的问题):
我们会有秩序的!
读一读,看看是否有用。

相关问题