Cassandra 中的通用 VS 特定模型?

Generic VS Specific model in Cassandra?

很长post所以让我们从一些上下文开始: 天气数据在我们的架构中起着核心作用。一个天气数据主要由五个值组成:

但我们还可以有更多的自定义值。

我们的特点是:

缺失值: 所有这五个值并不总能从一个气象站获得。有时我们需要从最近的气象站获取缺失值(例如:全球辐射)

采样率:对于一个给定的气象站,五个值之间的采样率可能不同。

虚拟站:我们还有特殊的“虚拟”气象站,由独立的气象传感器(来自真实气象站)组成。

在所有情况下,在采集过程结束时,对于气象站(真实或虚拟)中的每个事件,我们都需要根据这五个值计算一些更高级别的指数。这五个值或更高级别的指数中的一些指数每天汇总。

我们计划使用Spark进行数据处理。

这三个模型中哪个最相关并且不会剥夺我们 Cassandra 的好处?

如何管理传感器与weather_stations(缺失数据和虚拟站)之间的关系?

传感器模型 - 一个 table 用于所有数据

CREATE TABLE sensor_data {
    sensor_id uuid
    day text,
    timestamp timestamp,
    sensor_type text,
    value double,
    weather_station_id
    PRIMARY KEY ((sensor_id, day), timestamp)
}

CREATE TABLE weather_data {
    weather_station_id uuid,
    day date,
    timestamp timestamp,
    sensor_data seq<sensor_data>
    PRIMARY KEY ((weather_station_id, day), timestamp)
}

测量模型 - 一个 table 按数据类型

CREATE TABLE weather_temperature {
    sensor_id uuid,
    day text,
    timestamp timestamp,
    value double,
    weather_station_id
    PRIMARY KEY ((sensor_id, day), timestamp)
}

CREATE TABLE weather_rain {
...
}

所有类型的测量都一样。然后我们需要从这些 table 中处理数据以聚合所有内容,以较低的采样率填充缺失值和重复值。

CREATE TABLE weather_data (
    weather_station_id uuid,
    day date,
    timestamp timestamp,
    ...
    PRIMARY KEY ((weather_station_id, day), timestamp)
);

气象站模型 - 一个 table 包含所有数据

CREATE TABLE weather_data (
    weather_station_id text,
    day date,
    timestamp timestamp,
    temperature float,
    rain float,
    global_radiation float,
    relative_humidity float,
    wind_speed float,
    wind_direction float,
    PRIMARY KEY ((weather_station_id, day), timestamp)
);

然后我们用较低采样率的虚拟站、缺失值和重复值填充一个weather_data_processedtable。

要回答这个问题,了解您计划如何使用 cql 查询数据很重要。你能提供更多相关信息吗?

要解决 'virtual weather stations' 的问题,您可以采用以下方法:

CREATE TABLE weather_data_station_sensor (
    weather_station_id text,
    sensor_id text,
    day date,
    timestamp timestamp,
    temperature float,
    rain float,
    global_radiation float,
    relative_humidity float,
    wind_speed float,
    wind_direction float,
    PRIMARY KEY ((weather_station_id, day), sensor_id, timestamp)
);

并且对真实站和虚拟站使用相同的 table。当您从属于真实站和虚拟站的传感器获得读数时,您可以使用 BATCH 进行两次(或更多次更新)。例如:

BEGIN BATCH
INSERT INTO weather_data_station_sensor (weather_station_id, sensor_id ...etc) VALUES ('station_1', 'id_1' ... etc);
INSERT INTO weather_data_station_sensor (weather_station_id, sensor_id ...etc) VALUES ('station_2', 'id_1' ... etc);
APPLY BATCH