使用各种数据类型的数据方案 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)。但也要注意 intValuestrValue 不存在。 Cassandra 不像 RDBMS 那样强制使用 null 值。

明显的缺点是数据转换,例如用于计算 MAX、AVG 等。

也许您已经知道这一点,但我确实想提一下,Cassandra CQL 不包含MAXAVG 或任何其他数据聚合函数的定义。您要么需要在客户端执行该操作,要么实施 Apache-Spark 来执行 OLAP 类型的查询。

请务必通读 Patrick McFadin 的 Getting Started With Time Series Data Modeling。它包含有关如何解决此类时间序列问题的好建议。

【讨论】:

刚刚意识到我错过了您提到的“浮动”。我在示例中使用了bigint,但原理保持不变。

以上是关于使用各种数据类型的数据方案 Cassandra的主要内容,如果未能解决你的问题,请参考以下文章

支持的 Cassandra NoSQL 数据库类型

如何检查 Cassandra 表的文本字段的长度

Cassandra数据库上数据分析的替代方案

Cassandra 时间数据类型

DSE (Cassandra) - int 数据类型的范围搜索

如何安装和配置Cassandra