假设我们有一个名为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服务进行处理,但我现在不知道这种方法的效率。。。有什么建议吗?
2条答案
按热度按时间8gsdolmq1#
所以我找到了解决办法,我会贴出来,以防别人有同样的问题。正如我所读到的,数据建模似乎就是答案。也就是说:
在cassandra数据库中,我们有分区键和聚类键,cassandra具有同时处理多个插入的能力。这使我们可以同时在多个表中插入数据,这意味着我们可以为同一个数据收集应用程序创建不同的表,这些表将以物化视图(mysql)的方式使用。
例如,假设我们有日志模式{sensor\u id,region,value},首先想到的是生成一个名为sensor\u per\u row的表,如下所示:
这是一种非常有效的长时间存储数据的方法,但是考虑到cassandra函数,可视化并从中获得分析并不是那么简单。因此,我们可以用ttl(ttl代表生存时间)创建不同的表,ttl只是表示数据将被存储多长时间。
例如,如果我们想获得特定传感器的每日测量值,我们可以创建一个表,其中day&sensor\ id作为分区键,timestamp作为集群键,使用desc order。
如果我们加上一个ttl值126060*60代表一天,我们就可以存储每天的数据。
因此,创建一个具有上述格式的表sensor\u per\u day,ttl将实际给出每日测量值。在一天结束时,该表将刷新新的测量值,而数据将保留在previews表sensor\u per\u行中
我希望我给了你这个主意。
dbf7pr2w2#
nosql限制
在使用nosql时,我们通常不得不放弃:
一些酸性物质。
瓶盖的稠度。
洗牌操作:加入,分组。
您可以通过从表中读取数据(行)并求和来执行上述操作。
您还可以参考cassandra中的answer max()、distinct和group by