CQL 按时间范围检索时间序列数据

问题描述 投票:0回答:1

我在不同位置有传感器,每个传感器测量多个参数。每个传感器每天大约会进行 200 万次测量。我需要按位置/时间范围查询,但指定的范围永远不会大于几天。一个示例查询是:

SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND measurementTime >= 2023-10-15T23:00:00Z AND measurementTime <= 2023-10-16T01:00:00Z;

为了控制分区大小,我可以根据时间窗口拆分分区(我在某处读到这称为分桶) - 例如按纪元后的每一天:

CREATE TABLE meas (
    latitude double,
    longitude double,
    dayOfMeasurement int,
    measurementTime timestamp,
    param1 double,
    param2 double, 
    param3 double, 
    etc...
    PRIMARY KEY ((latitude, longitude, dayOfMeasurement), measurementTime)
) WITH CLUSTERING ORDER BY (measurementTime DESC)

现在我有两个选择:

  1. 在 WHERE 语句中使用 IN - 类似(假设从纪元到 2023 年 10 月 16 日有 19646 天):
SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND dayOfMeasurement IN (19646,19645) AND measurementTime >= 2023-10-15T23:00:00Z AND measurementTime <= 2023-10-16T01:00:00Z;
  1. 或使用多个(上例中为两个)单独的查询并在客户端组合结果(我正在使用 datastax Cassandra 驱动程序)。
SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND dayOfMeasurement=19645 AND measurementTime >= 2023-10-15T23:00:00Z AND measurementTime < 2023-10-16T00:00:00Z;
SELECT * FROM meas WHERE latitude=46.1 AND longitude=15.1 AND dayOfMeasurement=19646 AND measurementTime >= 2023-10-16T00:00:00Z AND measurementTime <= 2023-10-16T01:00:00Z;

这两个选项哪个更好?如果选项 2 更好 - 是否有一种标准方法可以在 datastax java 驱动程序中组合多个查询的结果? 或者我应该使用其他数据模型?

cassandra datastax cql partition bucketing
1个回答
0
投票

每个传感器每天大约会进行 200 万次测量

我很好奇分区有多大。说实话,我建议除了按天之外还按小时进行细分,因为每个分区似乎有太多行。但如果它已经工作正常,那么可能就没问题了。

使用多个(上例中为两个)单独的查询并在客户端组合结果

这是我推荐的方法。另一种方法(使用

IN
)的问题是返回结果的顺序会不一致。它将按日期和传感器分组,并按
measurementtime
排序。但分区的顺序将取决于令牌的哈希值,这将不一致。所以我想说,为了确保应用程序级别的行为一致,一些客户端工作是必要的。

您能详细说明一下吗?

所以一般来说,将分区大小保持在 1 或 2 MB 以下是个好主意。保留每个分区的行数也是一个很好的做法 <= 100,000. When rowcounts or partition sizes exceed those values is when operations tend to slow down.

现在,这些并不是严格的数学限制;而是。只是一般准则。一个包含 200 万个小行的分区很可能仍然可以工作。我什至见过大小为 10 MB 或更大的分区。这实际上取决于有效负载大小和访问模式。这就是我上面说的“如果它已经有效,那么它可能没问题。”

© www.soinside.com 2019 - 2024. All rights reserved.