聚类键列必须与 CLUSTERING ORDER BY 指令中的列完全匹配

Posted

技术标签:

【中文标题】聚类键列必须与 CLUSTERING ORDER BY 指令中的列完全匹配【英文标题】:Clustering key columns must exactly match columns in CLUSTERING ORDER BY directive 【发布时间】:2020-09-01 23:56:18 【问题描述】:

我正在尝试使用创建查询创建集群列

CREATE TABLE videos_by_tag (
       tag text,
       video_id uuid,
       added_date timestamp,
       title text,
       PRIMARY KEY ((tag), added_date, video_id)
) WITH CLUSTERING ORDER BY(added_date DESC);

它显示以下错误。我在创建表中遗漏了什么吗?

InvalidRequest:来自服务器的错误:code=2200 [Invalid query] message=""

仅当我包含主键中提到的所有聚类列(在本例中为 added_date、video_id)时,它才有效。是否必须按聚类顺序包含主键中的所有列?

CREATE TABLE videos_by_tag (
       tag text,
       video_id uuid,
       added_date timestamp,
       title text,
       PRIMARY KEY ((tag), added_date, video_id)
) WITH CLUSTERING ORDER BY(added_date DESC,video_id ASC);

我在 mac os 上使用的是以下版本的 cassandra

[cqlsh 5.0.1 |卡桑德拉 4.0.0.680 | CQL 规范 3.4.5

仅当我包含主键中提到的所有聚类列(在本例中为 added_date、video_id)时,它才有效。是否必须按聚类顺序包含主键中的所有列?

【问题讨论】:

【参考方案1】:

看起来这个问题也发布在 https://community.datastax.com/questions/4118/ 上,我在这里重新发布我的答案。

是的,必须在 DataStax Enterprise 6.8.0 的 CLUSTERING ORDER BY 指令中指定所有聚类列。 CREATE TABLE 的逻辑在 Apache Cassandra 4.0-alpha1 (CASSANDRA-13426) 中已更改,但在 C* 4.0-alpha4 (CASSANDRA-15271) 中已恢复。以前的 [accepted] 行为将包含在 DSE 6.8 的未来版本中。干杯!

【讨论】:

我不太明白您所说的“以前的 [已接受] 行为将包含在 DSE 6.8 的未来版本中”是什么意思。你能详细说明一下这个话题吗? DSE 6.8.4 当前要求在CLUSTERING ORDER BY 部分中命名所有集群列。 DSE 会继续强制执行这一点并在这方面与 Cassandra 不同步,还是会返回允许省略所有列的显式命名?如果有,从哪个版本开始? 之前的行为是允许在不指定所有集群列的情况下创建表,但 CASSANDRA-13426 改变了该规范。它在 CASSANDRA-15271 中被恢复为以前接受的行为。干杯! 我明白了。我的问题更针对这与 DSE 版本之间的关系。我们即将安装 6.8.4 上面的问题。在以后的版本中,这将不再是问题了吗? 抱歉,我没有完全阅读您的后续问题。 DSE 领先于 OSS C*。 C-15271 是在尚未发布的 C* 4.0 中完成的。我们将在 DSE 的未来版本中实施 15271。干杯!

以上是关于聚类键列必须与 CLUSTERING ORDER BY 指令中的列完全匹配的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 更新 - 带有时间戳聚类键的“位置”

Cassandra 复合聚类键和排序查询

在雪花中设置表自动聚类不会对表进行聚类

聚类(Clustering)

谱聚类算法(Spectral Clustering)优化与扩展(转载)

是否可以从分区中的每个聚类键Y中选择X记录?