使用各种数据类型的数据方案 Cassandra
Posted
技术标签:
【中文标题】使用各种数据类型的数据方案 Cassandra【英文标题】:Data scheme Cassandra using various data types 【发布时间】:2015-04-22 19:06:14 【问题描述】:目前我正在开发时间序列数据领域的解决方案。在这些数据中,我们有:一个 ID、一个值和一个时间戳。 所以它来了:值可能是布尔型、浮点型或字符串类型。我考虑了三种方法:
a) 对于每种数据类型,都有一个不同的表,所有布尔类型的传感器值到一个表中,所有字符串类型的传感器值到另一个表中。明显的缺点是您必须知道在哪里寻找某个传感器。
b) 描述数据类型以及所有字符串类型值的元列。明显的缺点是数据转换,例如用于计算 MAX、AVG 等。
c) 具有三个不同类型的列,但每个记录只有一个具有一个值。缺点是每 100 毫秒触发 500000 个传感器……大量未使用的空间。
由于我的知识有限,感谢任何帮助。
【问题讨论】:
【参考方案1】: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。它包含有关如何解决此类时间序列问题的好建议。
【讨论】:
刚刚意识到我错过了您提到的“浮动”。我在示例中使用了bigint
,但原理保持不变。以上是关于使用各种数据类型的数据方案 Cassandra的主要内容,如果未能解决你的问题,请参考以下文章