我有一个cassandra数据库,该数据库的表包含以下列:
itemid
和userid
是主键。我的查询如下:
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名电影。
答案 0 :(得分:3)
Cassandra只能按群集列对结果进行排序。它不能通过聚合函数对结果进行排序。
您可以选择几个选项来完成此操作。
如果您只希望每个查询返回有限数量的行,则此选项可能有效。
请注意,当您知道聚合函数仅适用于有限的行数时,建议您仅使用聚合函数(例如avg())。理想情况下,仅应在单个分区上运行时使用它们(使用WHERE子句限制为单个分区)。如果您没有任何限制,则可能会看到查询非常慢,或者如果Cassandra需要读取大量行以计算聚合,查询就会超时。
如果您需要更大数据集的计算平均值,这是最佳选择。
如果将average_rating
设为聚类列,Cassandra将按排序顺序存储每个分区的平均值。从卡桑德拉的角度来看,这是非常有效的。
缺点是,每次插入或更新一行时,您都需要计算应用程序中的平均值,因为它将成为Cassandra表中的主键列。
您可能要研究的一件事是使用Cassandra触发器为您计算平均值。如果您有多个应用程序向该表写入数据,这可能会使您的生活更轻松,但是我实际上不确定是否可以通过自定义触发器修改主键列。如果您决定选择此选项,我建议您进行一些研究和测试。您可以阅读有关触发器here的信息。