全部,
我们正在为基于iOT的应用程序进行POC。选择的数据库是cassandra。我们将从安装在车辆上的设备接收时间序列数据。时间序列数据的主要属性如下所示
我们计划将月份和年份作为分区键,设备ID和时间戳作为群集键...这是使用以下类型的查询获取数据的最佳方式
先谢谢
答案 0 :(得分:2)
使用查询驱动方法完成Cassandra中的数据建模是最好的。请参阅此blog post了解"规则"在建模Cassandra。
规则1:在群集中均匀传播数据
规则2:最小化分区数量
您在问题中提供了2个查询,这些查询仅在范围上有所不同。一种是通过设备ID在时间范围内请求数据,另一种是与设备ID无关的时间范围内的数据。
在开始日期之间检索具有DeviceId的设备的数据 和结束日期
在开始日期之间检索所有设备的数据 和结束日期
您的表应支持的查询如下所示:
在时间段y期间设备的纬度,长度,速度是多少
分区时应考虑数据点的数量。什么是正常的时间框架?是分钟,小时,日,周,月吗?该时间范围应该有助于确定如何处理写入和分区。如果您在月份和年份进行分区,那将适用于传感器读数,每月读数不会超过20亿。有关围绕限制进行分区的详细说明,请参阅this SO answer。
了解分区是启用范围结果集的关键。请参阅以下摘录自"Deep look at the CQL WHERE clause"。
您将无法使用<,>分区键上的运算符。 (允许过滤可以解决这个问题,但不要将其作为核心模式设计的一部分。)必须在集群列上使用运算符。
Cassandra使用。分配节点上的分区 选定的分区器。因为只有ByteOrderedPartitioner保持一个 有序的数据分布Cassandra不支持>,> =,< =和 <操作员直接在分区键上。
相反,它允许您使用>,> =,< =和<操作员 通过使用令牌功能来分区键。
SELECT * FROM numberOfRequests
WHERE token(cluster, date) > token('cluster1', '2015-06-03')
AND token(cluster, date) <= token('cluster1', '2015-06-05')
AND time = '12:00';
答案 1 :(得分:-2)
Dunno关于这一点,但是如何使用ELK /弹性搜索作为你的时间DB ...