使用各种数据类型的数据方案 Cassandra

Data scheme Cassandra using various data types

目前我正在开发时间序列数据领域的解决方案。在这些数据中,我们有:一个 ID、一个值和一个时间戳。 所以它来了:值可能是 boolean、float 或 string 类型。我考虑三种方法:

a) 对于每个数据类型,一个不同的 table,所有布尔类型的传感器值到一个 table,所有字符串类型的传感器值到另一个。明显的缺点是您必须知道在哪里寻找某个传感器。

b) 描述数据类型以及所有字符串类型值的元列。明显的缺点是数据转换,例如用于计算 MAX、AVG 等。

c) 具有三列不同类型,但每条记录只有一列具有一个值。缺点是每 100 毫秒触发 500000 个传感器……大量未使用的 space.

由于我的知识有限,我们将不胜感激。

500000 sensors firing every 100ms

第一件事是确保正确分区,确保不超过每个分区 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

...plenty of unused space.

你可能会感到惊讶。使用上面 SELECT *CQL 输出,似乎到处都是 null 值。但是当我们使用 cassandra-cli 工具查看数据的存储方式时,看看会发生什么 "under the hood:"

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(假)。但还要注意 intValuestrValue 不存在。 Cassandra 不像 RDBMS 那样强制 null 值。

The obvious disadvantage is the data conversion e.g. for calculating the MAX, AVG and so on.

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

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