500000 个传感器每 100 毫秒触发一次
首先,确保分区正确,确保不超过每个分区 20 亿列的限制。
CREATE TABLE sensorData (
stationID uuid,
datebucket text,
recorded timeuuid,
intValue bigint,
strValue text,
blnValue boolean,
PRIMARY KEY ((stationID,datebucket),recorded));
每 100 毫秒有 50 万次,即每秒 5 亿次。因此,您需要将您的datebucket 设置为非常精细……精确到第二个。接下来我将插入一些数据:
stationid | datebucket | recorded | blnvalue | intvalue | strvalue
--------------------------------------+---------------------+--------------------------------------+----------+----------+----------
8b466f1d-8d6b-46fa-9f5b-8c4eb51aa40c | 2015-04-22T14:54:29 | 6338df40-e929-11e4-88c8-21b264d4c94d | null | 59 | null
8b466f1d-8d6b-46fa-9f5b-8c4eb51aa40c | 2015-04-22T14:54:29 | 633e0f60-e929-11e4-88c8-21b264d4c94d | null | null | CD
8b466f1d-8d6b-46fa-9f5b-8c4eb51aa40c | 2015-04-22T14:54:29 | 6342f160-e929-11e4-88c8-21b264d4c94d | True | null | null
3221b1d7-13b4-40d4-b41c-8d885c63494f | 2015-04-22T14:56:19 | a48bbdf0-e929-11e4-88c8-21b264d4c94d | False | null | null
...大量未使用的空间。
您可能会感到惊讶。通过上面SELECT * 的CQL 输出,似乎到处都有null 值。但是请注意,当我们使用cassandra-cli 工具查看数据是如何“在后台”存储时会发生什么:
RowKey: 3221b1d7-13b4-40d4-b41c-8d885c63494f:2015-04-22T14\:56\:19
=> (name=a48bbdf0-e929-11e4-88c8-21b264d4c94d:, value=, timestamp=1429733297352000)
=> (name=a48bbdf0-e929-11e4-88c8-21b264d4c94d:blnvalue, value=00, timestamp=1429733297352000)
如您所见,为 stationid=3221b1d7-13b4-40d4-b41c-8d885c63494f AND datebucket='2015-04-22T14:56:19' 所在的 CQL 行存储的数据(上图)显示 blnValue 的值为 00 (false)。但也要注意 intValue 和 strValue 不存在。 Cassandra 不像 RDBMS 那样强制使用 null 值。
明显的缺点是数据转换,例如用于计算 MAX、AVG 等。
也许您已经知道这一点,但我确实想提一下,Cassandra CQL 不包含MAX、AVG 或任何其他数据聚合函数的定义。您要么需要在客户端执行该操作,要么实施 Apache-Spark 来执行 OLAP 类型的查询。
请务必通读 Patrick McFadin 的 Getting Started With Time Series Data Modeling。它包含有关如何解决此类时间序列问题的好建议。