Cassandra使用聚合函数,然后按该聚合排序

时间:2018-10-04 03:27:54

标签: cassandra cql

我有一个cassandra数据库,该数据库的表包含以下列:

  • itemid
  • 用户ID
  • 评分

itemiduserid是主键。我的查询如下:

SELECT itemid, avg(rating) as avgRating from mytable GROUP BY itemid order by avgRating asc;

我收到以下错误:

  

InvalidRequest:来自服务器的错误:code = 2200 [Invalid query] message =“ ORDER BY仅在分区键受EQ或IN限制时才受支持。”

我该如何解决?

我需要按平均收视率排序,这样我才能根据平均收视率获得前10名电影。

1 个答案:

答案 0 :(得分:3)

Cassandra只能按群集列对结果进行排序。它不能通过聚合函数对结果进行排序。

您可以选择几个选项来完成此操作。

  1. 进行查询,然后在应用程序中对结果重新排序。

如果您只希望每个查询返回有限数量的行,则此选项可能有效。

请注意,当您知道聚合函数仅适用于有限的行数时,建议您仅使用聚合函数(例如avg())。理想情况下,仅应在单个分区上运行时使用它们(使用WHERE子句限制为单个分区)。如果您没有任何限制,则可能会看到查询非常慢,或者如果Cassandra需要读取大量行以计算聚合,查询就会超时。

  1. 在表中存储预先计算的平均值,或将其缓存在应用程序中。

如果您需要更大数据集的计算平均值,这是最佳选择。

如果将average_rating设为聚类列,Cassandra将按排序顺序存储每个分区的平均值。从卡桑德拉的角度来看,这是非常有效的。

缺点是,每次插入或更新一行时,您都需要计算应用程序中的平均值,因为它将成为Cassandra表中的主键列。

您可能要研究的一件事是使用Cassandra触发器为您计算平均值。如果您有多个应用程序向该表写入数据,这可能会使您的生活更轻松,但是我实际上不确定是否可以通过自定义触发器修改主键列。如果您决定选择此选项,我建议您进行一些研究和测试。您可以阅读有关触发器here的信息。

相关问题