在cassandra cqlsh中对数据进行分组并提取平均值

lsmd5eda  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(376)

假设我们有一个名为sensors的键空间和一个名为sensor\ per\ u行的表。此表具有以下结构:

sensor_id | ts | value

在这种情况下,senor\u 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(用户定义函数),但是这个函数只运行一行。是否可以在自定义项中选择数据?另一种方法是使用java等,每天进行多个查询,或者将其他一些联系点中的数据作为rest web服务进行处理,但我现在不知道这种方法的效率。。。有什么建议吗?

8gsdolmq

8gsdolmq1#

所以我找到了解决办法,我会贴出来,以防别人有同样的问题。正如我所读到的,数据建模似乎就是答案。也就是说:
在cassandra数据库中,我们有分区键和聚类键,cassandra具有同时处理多个插入的能力。这使我们可以同时在多个表中插入数据,这意味着我们可以为同一个数据收集应用程序创建不同的表,这些表将以物化视图(mysql)的方式使用。
例如,假设我们有日志模式{sensor\u id,region,value},首先想到的是生成一个名为sensor\u per\u row的表,如下所示:

sensor_id | value | region     | ts

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

这是一种非常有效的长时间存储数据的方法,但是考虑到cassandra函数,可视化并从中获得分析并不是那么简单。因此,我们可以用ttl(ttl代表生存时间)创建不同的表,ttl只是表示数据将被存储多长时间。
例如,如果我们想获得特定传感器的每日测量值,我们可以创建一个表,其中day&sensor\ id作为分区键,timestamp作为集群键,使用desc order。
如果我们加上一个ttl值126060*60代表一天,我们就可以存储每天的数据。
因此,创建一个具有上述格式的表sensor\u per\u day,ttl将实际给出每日测量值。在一天结束时,该表将刷新新的测量值,而数据将保留在previews表sensor\u per\u行中
我希望我给了你这个主意。

dbf7pr2w

dbf7pr2w2#

nosql限制
在使用nosql时,我们通常不得不放弃:
一些酸性物质。
瓶盖的稠度。
洗牌操作:加入,分组。
您可以通过从表中读取数据(行)并求和来执行上述操作。
您还可以参考cassandra中的answer max()、distinct和group by

相关问题