0

这篇文章很长,让我们从一些背景开始:天气数据在我们的架构中起着核心作用。一个天气数据主要由五个值组成:

  • 温度
  • 全球辐射
  • 风(方向、速度)
  • 相对湿度

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

我们的特点是:

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

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

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

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

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

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

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

传感器模型 - 所有数据的一张表

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)
}

测量模型 - 按数据类型的一张表

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 {
...
}

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

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

气象站模型 - 一张包含所有数据的表格

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_processed 表。

4

1 回答 1

0

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

要解决“虚拟气象站”的问题,您可以使用以下方法:

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)
);

并为真实和虚拟站使用同一张表。当您从同时属于真实站和虚拟站的传感器获得读数时,您可以使用 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
于 2016-03-04T00:44:24.507 回答