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
很长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