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

Cassandra use aggregate function and then order by that aggregate

我有一个带有 table 的 cassandra 数据库,其中包含以下列:

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

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

我收到以下错误:

InvalidRequest: Error from server: code=2200 [Invalid query] message="ORDER BY is only supported when the partition key is restricted by an EQ or an IN."

我该如何解决这个问题?

之后我需要按平均评分排序,这样我才能根据平均评分获得前 10 部电影。

Cassandra 只能通过聚类列对结果进行排序。它无法通过聚合函数对结果进行排序。

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

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

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

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

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

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

如果您创建 average_rating 聚类列,Cassandra 将按排序顺序存储每个分区的平均值。从 Cassandra 的角度来看,这是非常有效的。

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

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