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

unhi4e5o  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(669)

我有一个cassandra数据库,它的表包含以下列:
项目ID
用户ID
评级 itemid 以及 userid 是主键。我的查询如下所示:

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

我得到以下错误:
invalidrequest:error from server:code=2200[invalid query]message=“仅当分区键受eq或in限制时才支持order by。”
我怎样才能解决这个问题?
我需要订购的平均收视率后,这样我就可以得到前10名的电影根据他们的平均收视率。

zkure5ic

zkure5ic1#

cassandra只能按聚类列对结果排序。它不能按聚合函数对结果排序。
为了实现这一点,您可以考虑几个选项。
进行查询,然后在应用程序中对结果重新排序。
如果您只希望从每个查询返回有限数量的行,则此选项可能有效。
请注意,如果您知道聚合函数只应用于有限数量的行,则建议您只使用聚合函数(如avg())。理想情况下,您应该仅在对单个分区进行操作时使用它们(使用where子句限制为单个分区)。如果没有任何限制,您可能会看到非常慢的查询,或者如果cassandra需要读取大量行以计算聚合,则会出现查询超时。
将预先计算的平均值存储在表中,或将其缓存在应用程序中。
如果需要在更大的数据集上计算平均值,这是最好的选择。
如果你能 average_rating 聚类列cassandra将按排序顺序存储每个分区的平均值。从Cassandra的Angular 来看,这是非常有效的。
缺点是每次插入或更新行时都需要计算应用程序中的平均值,因为它将是cassandra表中的主键列。
你可以研究的一件事是使用Cassandra触发器为你计算平均值。如果有多个应用程序写入此表,这可能会使您的工作更轻松,但是我不确定是否可以通过自定义触发器修改主键列。如果您决定考虑此选项,我建议您进行一些研究和测试。你可以在这里阅读触发器。

相关问题