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

时间:2015-06-21 11:31:56

标签: database-design cassandra cql bigdata nosql

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

简而言之,根据测量间隔/读取类型,输入的原始数据将以逗号分隔值的形式存储在不同的文件中,这主要取决于我调用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,..

对于每日阅读,我们显然会跳过时间细节,因为每个朱利安日只收集一次阅读。你可能会明白这一点。

因此每个位置都有自己的读取间隔,其中数据列的数量,即感兴趣的参数取决于读取的间隔/类型。例如,每日数据包括~20列和每小时~15。

感兴趣的查询:

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

  • 特定值是否在给定阈值内(<,>)?
  • 以给定间隔(sensor_id)和时间(主要用于绘图)获取所有参数

我最初的想法也只是将日期/时间参数转换为时间戳,只需将每行/读取插入到与原始文件具有相同结构的表中。例如,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,timestamp)和聚类键的时间戳。这显然适用于我们想要获取在特定时间获取的所有值的情况,但不适用于我们在执行QC时感兴趣的范围查询。

这就是我所处的地方,我很乐意听取您对此的看法。

1 个答案:

答案 0 :(得分:0)

我对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) )

这将允许您选择特定年份内的录音。如果您需要按时间排序的结果,则可以在应用程序的代码中进行排序。