【问题标题】:Data scheme Cassandra using various data types使用各种数据类型的数据方案 Cassandra
【发布时间】:2015-04-22 19:06:14
【问题描述】:

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

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

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

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

由于我的知识有限,感谢任何帮助。

【问题讨论】:

    标签: cassandra bigdata data-modeling


    【解决方案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,但原理保持不变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2016-12-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多