Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra使用聚合函数,然后按该聚合排序_Cassandra_Cql - Fatal编程技术网

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

Cassandra使用聚合函数,然后按该聚合排序,cassandra,cql,Cassandra,Cql,我有一个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或I

我有一个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名电影。

Cassandra只能按聚类列排序结果。它不能按聚合函数对结果排序

为了实现这一点,您可以考虑几个选项

  • 进行查询,然后在应用程序中对结果重新排序 如果您只希望从每个查询返回有限数量的行,则此选项可能有效

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

  • 将预先计算的平均值存储在表中,或将其缓存在应用程序中
  • 如果需要在更大的数据集上计算平均值,这是最好的选择

    如果您进行
    average\u评级
    Cassandra集群列将按排序顺序存储每个分区的平均值。从卡桑德拉的角度来看,这是非常有效的

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


    你可以研究的一件事是使用Cassandra触发器为你计算平均值。如果有多个应用程序写入此表,这可能会使您的工作更轻松,但是我不确定是否可以通过自定义触发器修改主键列。如果您决定考虑此选项,我建议您进行一些研究和测试。您可以阅读有关触发器的内容。

    在Cassandra中,您可以围绕查询而不是数据对表进行建模。因此,从这个角度来看,如果您有一个根据平均评级获得前10名电影的查询,那么您将需要一个满足该查询的表。表结构可能非常简单,如电影id和分级,电影id作为主键,分级作为集群列ordered desc。缺点是您需要维护该表(如定期更新平均分级)。@Horia电影id和分级的简单表不能解决此问题。是否可以将平均聚合作为表中的一列?