gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:41:42 25 4
gpt4 key购买 nike

总而言之,我想创建一个 SMACK 架构(Spark、Mesos、Akka、Cassandra 和 Kafka)。我想创建一个入口点,在那里我可以返回数据库中添加的最后 50 个元素。这是我的数据库:

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.

所以我的问题是 SELECT 如何获取我添加的最后一个元素?

我看到我可以通过这样做来订购 table :
) WITH CLUSTERING ORDER BY (time DESC);

但是要做到这一点,我需要将时间更改为主键,但同时添加了一些数据,因此我无法将其设置为主键。

最佳答案

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

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

您是否曾经通过 uuid 查询?如果是这样,那么我们可以建立一个新表。如果没有,您将需要更改主键才能使其正常工作。在 ID 列上构建单个 PRIMARY KEY 会严重限制您的查询灵活性(正如您所发现的)。

This is a POC so as many as I can, for the moment I sent 1 million fireman



这将是你的第一个障碍。 Cassandra 每个分区只能支持 20 亿个单元,而且在此之前它会变慢。因此,我们希望通过“时间分桶”来限制每个分区的消防员事件数量。例如,我将使用 month_bucket ,但您应该确定这是否真的适合您的业务需求。

接下来,您要 ORDER BY日期,因此我们将其用作聚类键。实际上,如 date是一个文本字段,我们将使用 time因为我确定您不希望以 ASCII-betical 顺序返回结果。快教上 ORDER BY条款,是它完全是多余的。您只能按照集群 key 的预定顺序强制执行它。它不应该永远需要在查询中。

注:您收到您所看到的错误的原因是该排序顺序仅在数据分区内强制执行。它不能对结果集强制执行。

另外,我看到您正在对 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 中结果集排序的文章,并在其中演示了这些建模技术的使用。四年后它仍然非常重要(特别是对于这样的问题):

We Shall Have Order!

读一读,看看它是否有帮助。

关于cassandra - 如何设计 NoSQL 数据库以按时间戳选择数据顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55906125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com