这篇文章很长,让我们从一些背景开始:天气数据在我们的架构中起着核心作用。一个天气数据主要由五个值组成:
- 温度
- 雨
- 全球辐射
- 风(方向、速度)
- 相对湿度
但是我们也可以有更多的自定义值。
我们的特点是:
缺失值:所有这五个值并不总是可以从一个气象站获得。有时我们需要从最近的气象站获取缺失值(例如:全球辐射)
采样率:对于一个给定的气象站,五个值之间的采样率可以不同。
虚拟站:我们也有特殊的“虚拟”气象站,由分离的气象传感器(来自真实气象站)组成。
在所有情况下,在采集过程结束时,对于气象站(真实或虚拟)中的每个事件,我们都需要根据这五个值计算一些更高级别的指数。这五个值或更高级别的指数中的一些每天汇总。
我们计划使用 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 表。