【问题标题】:Order by in materialized view doesn't sort the results在物化视图中排序不会对结果进行排序
【发布时间】:2021-03-14 06:34:01
【问题描述】:

我有一个结构如下的表:

CREATE TABLE kaefko.se_vi_f55dfeebae00d2b3 (
value text PRIMARY KEY,
id text,
popularity bigint);

使用如下所示的数据:

value  | id               | popularity
--------+------------------+------------
rally  | 4eff16cb91f96cd6 |          2
reddit | 11aa39686ed66ba5 |          3
red    | 552d7e95af481415 |          1
really | 756bfa499965863c |          1
right  | c5850c6b08f7966b |          1
redis  | 7f1d251f399442d7 |          1

我已经创建了一个物化视图,该视图应该按照从最大到最小的受欢迎程度对这些值进行排序:

CREATE MATERIALIZED VIEW kaefko.se_vi_f55dfeebae00d2b3_by_popularity AS
SELECT *
FROM kaefko.se_vi_f55dfeebae00d2b3
WHERE popularity IS NOT null
PRIMARY KEY (value, popularity)
WITH CLUSTERING ORDER BY (popularity DESC);

但是物化视图中的数据是这样的:

value  | popularity | id
--------+------------+------------------
rally  |          2 | 4eff16cb91f96cd6
reddit |          3 | 11aa39686ed66ba5
really |          1 | 756bfa499965863c
right  |          1 | c5850c6b08f7966b
redis  |          1 | 7f1d251f399442d7

如您所见,有两个主要问题:

  1. 数据未按照具体化视图中的定义进行排序
  2. 物化视图中只有一部分数据

我在 Cassandra 方面的经验不是很丰富,而且我已经花了几个小时试图找出导致这种情况发生的原因,但无济于事。有人可以帮我吗?谢谢

__

我使用的是 ScyllaDB 4.1.9-0,cqlsh 显示如下:

[cqlsh 5.0.1 | Cassandra 3.0.8 | CQL spec 3.3.1 | Native protocol v4]

【问题讨论】:

  • 在 Cassandra 中,数据仅在分区内排序,而不是全局排序
  • @AlexOtt 这是什么意思?那么如何创建有序表呢?
  • 这就是 Cassandra 的工作方式——没有全局排序。如果你需要全局排序,你需要使用 Spark,或者类似的东西......或者其他数据库
  • 我尝试设置 Spark,但老实说我没有成功。对于像我这样的前端人员来说,这太复杂了。
  • 如果您需要在整个数据集上按 artitrary 列进行排序,那么我建议您查看其他数据库,或者类似 Elasticserarch 的数据库

标签: cassandra cassandra-3.0 scylla


【解决方案1】:

Alex的评论100%正确,顺序在分区内。

PRIMARY KEY (value, popularity)
WITH CLUSTERING ORDER BY (popularity DESC);

这意味着只有在“值”字段相同的值中,流行度的排序才会降序 - 如果我要更改您用来显示示例的数据,您会得到以下结果:

value  | popularity | id
--------+------------+------------------
rally  |          3 | 4eff16cb91f96cd6
rally  |          2 | 11aa39686ed66ba5
really |          3 | 756bfa499965863c
really |          2 | c5850c6b08f7966b
really |          1 | 7f1d251f399442d7

顺序基于每个分区键,而不是全局排序。

【讨论】:

  • 我明白了,所以如果我想模拟全局排序,那么所有行都必须具有相同的值。对吗?
  • 是的,尽管那将是一个非常非常糟糕的主意 - 使用单值分区键,因为所有数据都将位于同一个节点上。这不是一个合适的解决方案/解决方法
  • 如果我没记错的话,我不能有 PRIMARY KEY(值,流行度)和具有相同值的两行,因为主键必须是唯一的。
  • 我推荐 Scylla 提供的关于 Scylla/Cas​​sandra 数据建模的免费课程。 university.scylladb.com/courses/data-modeling
  • 正确,主键必须是主键 - 分区键同样不应是低基数值,因此使用唯一主键将所有行分组,但单个分区键将是非常糟糕的数据Cassandra 的模型。
猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多