我是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,timestamp),在该主密钥中,sensor _id将成为分区密钥,而timestamp将成为集群密钥。这显然适用于我们想要获取在特定时间获取的所有值的情况,但不适用于我们在执行QC时感兴趣的范围查询。
这就是我现在的处境,我很想听听你对此的看法。
我对卡桑德拉很陌生,但我想我可以在这里分享一些知识。
要启用天气参数的范围查询,您需要创建单独的表,这些天气参数充当集群列。例如,为了能够查询风速范围:
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
为了能够按时间过滤结果,您可以使用复合分区键(此处介绍)。例如:
CREATE TABLE location_by_wind_speed_year (sensor_id bigint, weather_speed int,
date timestamp, data1 ..., PRIMARY KEY ((sensor_id, year), weather_speed) )
这将允许您选择特定年份内的录音。如果你需要按时间排序结果,你可以在应用程序的代码中进行排序。