【问题标题】:Group data and extract average in Cassandra cqlsh在 Cassandra cqlsh 中对数据进行分组并提取平均值
【发布时间】:2019-05-31 12:40:18
【问题描述】:

假设我们有一个名为 sensors 的键空间和一个名为 sensor_per_row 的表。 该表具有以下结构:

sensor_id | ts | value

在这种情况下,senor_id 表示分区键,ts(即创建记录的日期)表示集群键。

 select sensor_id, value , TODATE(ts) as day ,ts from sensors.sensor_per_row

这个选择的结果是

  sensor_id | value | day       | ts

 -----------+-------+------------+---------------

  Sensor 2 |  52.7 | 2019-01-04 | 1546640464138

  Sensor 2 |  52.8 | 2019-01-04 | 1546640564376

  Sensor 2 |  52.9 | 2019-01-04 | 1546640664617

如何按 ts 对数据进行分组,更具体地说,按日期对它们进行分组,并使用 cqlsh 返回表中每一行的日平均值。例如:

 sensor_id | system.avg(value) | day
-----------+-------------------+------------
  Sensor 2 |          52.52059 | 2018-12-11
  Sensor 2 |          42.52059 | 2018-12-10
  Sensor 3 |          32.52059 | 2018-12-11

我猜一种方法是使用 udf(用户定义函数),但这个函数只运行一行。是否可以在 udf 中选择数据? 另一种方法是使用 java 等,每天进行多次查询,或者将其他联系点中的数据作为休息网络服务处理,但我现在不知道它的效率......有什么建议吗?

【问题讨论】:

    标签: cassandra nosql cql


    【解决方案1】:

    NoSQL 限制

    在使用 NoSQL 时,我们通常不得不放弃:

    1. 一些 ACID 保证。
    2. CAP 的一致性。
    3. 洗牌操作:JOIN、GROUP BY。

    您可以通过从表中读取数据(行)并求和来执行上述操作。

    也可以参考答案MAX(), DISTINCT and group by in Cassandra

    【讨论】:

    • 是的,我已经阅读了这个主题,在 Cassandra (v.3 ++) 的最后一个版本中包含了 Group by,并且确实对数据进行了分组。但这里的问题是如何从按日期分组的数据中获取平均值。我想唯一的解决方案是使用后端语言并在那里处理数据。无论如何感谢您的回答,不胜感激:)
    【解决方案2】:

    所以我找到了解决方案,我会发布它以防其他人有同样的问题。 当我阅读 数据建模 似乎是答案。这意味着:

    Cassandra 数据库中,我们有 分区键集群键。Cassandra 具有同时处理多个插入的能力。这使我们可以同时在多个表中插入数据,这几乎意味着我们可以为同一个数据收集应用程序创建不同的表,这些表将以物化视图 (MySql) 的方式使用。

    例如,假设我们有日志架构 {sensor_id , region , value} , 首先想到的是生成一个名为 sensor_per_row 的表,例如:

        sensor_id | value | region     | ts
    
       -----------+-------+------------+---------------
    

    这是一种非常有效的长期存储数据的方法,但考虑到 Cassandra 功能,要对其进行可视化和分析并不是那么简单。 因此,我们可以使用 ttl(ttl 代表生存时间)创建不同的表,这意味着数据将存储多长时间。

    例如,如果我们想要获取特定传感器的每日测量值,我们可以创建一个表,其中 day 和 sensor_id 作为分区键,timestamp 作为集群键,并使用 Desc 顺序。

    如果我们加上一个 ttl 值 12*60*60*60 代表一天,我们可以存储我们的每日数据。

    因此,创建一个具有上述格式的表 sensor_per_dayttl 将实际给出每日测量值。在一天结束时,该表将是用新的测量值刷新,而数据将保留在预览表 sensor_per_row

    我希望我给了你这个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多