组数据并提取Cassandra cqlsh中的平均值

时间:2019-01-04 23:19:12

标签: cassandra nosql cql

假设我们有一个名为sensor的键空间和一个名为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等,每天进行多次查询,或者将其他联系点中的数据作为其余的Web服务进行处理,但是我现在不知道这种效率……任何建议吗?

2 个答案:

答案 0 :(得分:0)

NoSQL限制

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

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

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

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

答案 1 :(得分:0)

因此,我找到了解决方案,如果其他人有相同的问题,我将予以发布。 在我阅读数据建模时,这似乎是答案。意思是:

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

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

    sensor_id | value | region     | ts

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

这是长时间存储数据的非常有效的方法,但是鉴于Cassandra函数的存在,可视化并从中获取分析并不是那么简单。 因此,我们可以使用 ttl (ttl表示生存时间)创建不同的表,这仅表示数据将存储多长时间。

例如,如果我们要获取特定传感器的每日测量值,我们可以创建一个表,其中day&sensor_id为分区键,时间戳为聚类键(按Desc顺序)。

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

因此,创建一个具有上述格式和 ttl 的表 sensor_per_day 会实际给出每日测量值。最后,该表将刷新了较新的测量值,同时数据仍存储在预览表中 sensor_per_row

我希望我给你这个主意。