【问题标题】:How to model data in Cassandra for last 100 events for a customer如何在 Cassandra 中为客户的最后 100 个事件建模数据
【发布时间】:2015-05-15 23:41:38
【问题描述】:

我们有多个客户,每个客户运行多个传感器。每个传感器频繁记录数据(事件 20 秒)。如何在 Cassandra 中创建数据模型来回答此查询?

我们为其他查询考虑过这样的数据模型:

Create Table Data{
  CustomerId,
  SensorId,
  Date,
  DataTime
  SensorData1,
  SensorData2,
  Primary key ((CustomerId, SensorId, Date), DataTime) 
}

【问题讨论】:

    标签: cassandra data-modeling cql


    【解决方案1】:

    要满足对客户最近 100 个事件的查询,您需要对上述模型进行两项调整:

    1. 将您的主键定义调整为仅在您的 CustomerId 和您的日期存储桶 (Date) 上进行分区。然后,您需要在DataTime 上进行集群。为确保传感器的唯一性,您可能还需要在末尾添加SensorId

    2. datatime 上添加排序方向为DESCCLUSTERING ORDER。这将按datatime 将您的数据聚集在磁盘上,按最近的时间排序。

    基本上,我是这样创建你的表的:

    CREATE TABLE sensordata2 (
        customerid uuid,
        datebucket text,
        datatime timeuuid,
        sensorid text,
        sensordata1 text,
        sensordata2 text,
        PRIMARY KEY ((customerid, datebucket), datatime, sensorid)
    ) WITH CLUSTERING ORDER BY (datatime DESC, sensorid ASC);
    

    插入一些测试行后,我现在可以像这样查询WHERE customerid 3221b1d7-13b4-40d4-b41c-8d885c63494f 的最后 10 个传感器读数:

    aploetz@cqlsh:stackoverflow2> SELECT customerid, datebucket, sensorid, dateof(datatime), datatime, sensordata1, sensordata2
    FROM sensordata2 WHERE customerid=3221b1d7-13b4-40d4-b41c-8d885c63494f 
    AND datebucket='20150515' LIMIT 10;
    
     customerid                           | datebucket | sensorid | dateof(datatime)         | datatime                             | sensordata1 | sensordata2
    --------------------------------------+------------+----------+--------------------------+--------------------------------------+-------------+-------------
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       A1 | 2015-05-15 10:34:34-0500 | e3a15c20-fb17-11e4-93da-21b264d4c94d |          47 |          24
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       A1 | 2015-05-15 10:34:34-0500 | e39ffc90-fb17-11e4-93da-21b264d4c94d |          46 |          23
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       A1 | 2015-05-15 10:34:34-0500 | e39e4ee0-fb17-11e4-93da-21b264d4c94d |          45 |          22
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       B1 | 2015-05-15 10:34:22-0500 | dc64a340-fb17-11e4-93da-21b264d4c94d |          47 |          24
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       B1 | 2015-05-15 10:34:22-0500 | dc60aba0-fb17-11e4-93da-21b264d4c94d |          46 |          23
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       B1 | 2015-05-15 10:34:22-0500 | dc5d0220-fb17-11e4-93da-21b264d4c94d |          45 |          22
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       A1 | 2015-05-15 10:32:16-0500 | 90e27fa0-fb17-11e4-93da-21b264d4c94d |          47 |          24
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       A1 | 2015-05-15 10:32:16-0500 | 90e0aae0-fb17-11e4-93da-21b264d4c94d |          46 |          23
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       A1 | 2015-05-15 10:32:16-0500 | 90de8800-fb17-11e4-93da-21b264d4c94d |          45 |          22
     3221b1d7-13b4-40d4-b41c-8d885c63494f |   20150515 |       A1 | 2015-05-15 10:25:24-0500 | 9b5d1ae0-fb16-11e4-93da-21b264d4c94d |          47 |          24
    
    (10 rows)
    

    【讨论】:

    • 您的示例非常有用。谢谢。一个问题,如果客户要求 5 秒的数据频率,对于拥有 1000 多个传感器的客户,该模型将受到怎样的影响?我可以将日期桶分成几小时,但想知道是否还有其他方法。
    • 即使数据频率为每秒一次,您仍将低于每个分区 20 亿列的限制(每 CQL 行 3 列 x 每天 86400 秒 x 1000 个传感器 = 259,200,000 列) .但是,是的,在分区存储中获得更细粒度的方法是将日期存储桶进一步拆分。
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2021-12-15
    • 2018-10-27
    • 2018-04-08
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多