为水文时间序列数据选择 Cassandra 模式

Choosing Cassandra schema for hydrological time series data

我是 NoSQL 和 Cassandra 的新手,希望就我为处理水文数据的数据库选择模式设计的决定提供一些意见。作为旁注,我正在 Python 中开发应用程序,并且一直在玩弄 Datastax Python 驱动程序。

简而言之,传入的原始数据以逗号分隔的值存储在不同的文件中,具体取决于读数的测量interval/type,基本上取决于我调用的变量sensor_id。例如,每小时数据如下所示:

sensor_id (int), year (int), julianday (int), hourminute (int) , data1 (float), data2 (float), data3 (float)..

..所以示例阅读看起来像:

715, 2015, 15, 2230, 3.65, 6.12, 95.2 ,...
715, 2015, 15, 2330, 4.12, 5.12, 87.2 ,...

其中 715 表示它是每小时阅读,因此每日阅读将使用另一个 sensor_id。我们称它为 716,示例读数看起来像这样:

716, 2015, 15, 3.52, 5.23, 84.5,..

对于每日读数,我们显然跳过了时间细节,因为每个儒略日只收集一次读数。你可能明白了。

所以每个位置都有自己的读取间隔,其中数据列的数量,即感兴趣的参数取决于读取的 interval/type。例如,每日数据由 ~20 列和每小时 ~15 组成。

感兴趣的查询:

我希望能够运行对一些的数据参数进行简单的质量控制,大概主要是气温,水温,风速和水位,也许还有其他一些人。首先,这可能是检查参数值是否超过或低于给定的最大最小阈值。我还希望能够绘制原始数据、质量控制数据和未通过 QC 测试的值。

我最初的想法是将 date/time 参数转换为时间戳,然后将每个 row/reading 插入与原始文件具有相同结构的 table 中。例如,location_hourly 看起来(使用上面的值)

+-----------+---------------------+-------+-------+-------+--------+
| sensor_id |      timestamp      | data1 | data2 | data3 | data n |
+-----------+---------------------+-------+-------+-------+--------+
|       715 | 2015-01-01 22:30:00 | 3.65  | 6.12  | 95.2  |        |
|       715 | 2015-01-01 23:30:00 | 4.12  | 5.12  | 87.2  |        |
+-----------+---------------------+-------+-------+-------+--------+    

并设置主键(sensor_id,时间戳),其中 sensor_id 将成为分区键,时间戳成为集群键。这显然适用于我们想要获取在特定时间获取的所有值的情况,但不适用于我们在执行 QC 时感兴趣的范围查询。

这就是我所在的位置,我很想听听您对此的看法。

我对 Cassandra 很陌生,但我想我可以在这里分享一些知识。

要对天气参数启用范围查询,您需要创建单独的表,将这些天气参数用作集群列。例如,要能够查询风速范围:

CREATE TABLE location_by_wind_speed (sensor_id bigint, weather_speed int,
    date timestamp, data1 ..., PRIMARY KEY (sensor_id, weather_speed) )

那么你就可以这样查询了:

SELECT * FROM location_by_wind_speed WHERE sensor_id=123 
  AND wind_speed > 20 AND wind_speed < 100

为了能够按时间筛选结果,您可以使用复合分区键(描述 here)。例如:

CREATE TABLE location_by_wind_speed_year (sensor_id bigint, weather_speed int,
    date timestamp, data1 ..., PRIMARY KEY ((sensor_id, year), weather_speed) )

这将允许您在特定年份内 select 记录。如果您需要按时间排序的结果,您可以在您的应用代码中排序。