Cassandra 使用聚合函数,然后按该聚合排序
Cassandra use aggregate function and then order by that aggregate
我有一个带有 table 的 cassandra 数据库,其中包含以下列:
- itemid
- 用户 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="ORDER BY is only supported when the partition key is restricted by an EQ or an IN."
我该如何解决这个问题?
之后我需要按平均评分排序,这样我才能根据平均评分获得前 10 部电影。
Cassandra 只能通过聚类列对结果进行排序。它无法通过聚合函数对结果进行排序。
为了实现这一点,您可以考虑几个选项。
- 进行查询,然后在您的应用程序中对结果重新排序。
如果您只希望从每个查询返回有限数量的行,则此选项可能有用。
请注意,建议您仅在知道聚合函数(如 avg())仅适用于有限数量的行时才使用它。理想情况下,您应该只在对单个分区进行操作时使用它们(使用 WHERE 子句限制为单个分区)。如果您没有任何限制,您可能会看到非常慢的查询,或者如果 Cassandra 需要读取大量行以计算聚合时查询超时。
- 将预先计算的平均值存储在 table 中,或将其缓存在您的应用程序中。
如果您需要计算更大数据集的平均值,这是最佳选择。
如果您创建 average_rating
聚类列,Cassandra 将按排序顺序存储每个分区的平均值。从 Cassandra 的角度来看,这是非常有效的。
缺点是每次插入或更新行时都需要在应用程序中计算平均值,因为它将成为 Cassandra 中的主键列table。
您可以研究的一件事是使用 Cassandra 触发器为您计算平均值。如果您有多个应用程序写入此 table,这可能会让您的生活更轻松,但我实际上不确定是否可以通过自定义触发器修改主键列。如果您决定查看此选项,我建议您进行一些研究和测试。您可以阅读触发器 here.
我有一个带有 table 的 cassandra 数据库,其中包含以下列:
- itemid
- 用户 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="ORDER BY is only supported when the partition key is restricted by an EQ or an IN."
我该如何解决这个问题?
之后我需要按平均评分排序,这样我才能根据平均评分获得前 10 部电影。
Cassandra 只能通过聚类列对结果进行排序。它无法通过聚合函数对结果进行排序。
为了实现这一点,您可以考虑几个选项。
- 进行查询,然后在您的应用程序中对结果重新排序。
如果您只希望从每个查询返回有限数量的行,则此选项可能有用。
请注意,建议您仅在知道聚合函数(如 avg())仅适用于有限数量的行时才使用它。理想情况下,您应该只在对单个分区进行操作时使用它们(使用 WHERE 子句限制为单个分区)。如果您没有任何限制,您可能会看到非常慢的查询,或者如果 Cassandra 需要读取大量行以计算聚合时查询超时。
- 将预先计算的平均值存储在 table 中,或将其缓存在您的应用程序中。
如果您需要计算更大数据集的平均值,这是最佳选择。
如果您创建 average_rating
聚类列,Cassandra 将按排序顺序存储每个分区的平均值。从 Cassandra 的角度来看,这是非常有效的。
缺点是每次插入或更新行时都需要在应用程序中计算平均值,因为它将成为 Cassandra 中的主键列table。
您可以研究的一件事是使用 Cassandra 触发器为您计算平均值。如果您有多个应用程序写入此 table,这可能会让您的生活更轻松,但我实际上不确定是否可以通过自定义触发器修改主键列。如果您决定查看此选项,我建议您进行一些研究和测试。您可以阅读触发器 here.