当我尝试使用以下 cql 语句时出现上述错误,不确定它出了什么问题。
CREATE TABLE Stocks(
id uuid,
market text,
symbol text,
value text,
time timestamp,
PRIMARY KEY(id)
) WITH CLUSTERING ORDER BY (time DESC);
Bad Request: Only clustering key columns can be defined in CLUSTERING ORDER directive
但这工作正常,我不能使用一些不属于主键的列来排列我的行吗?
CREATE TABLE timeseries (
... event_type text,
... insertion_time timestamp,
... event blob,
... PRIMARY KEY (event_type, insertion_time)
... )
... WITH CLUSTERING ORDER BY (insertion_time DESC);
“我不能使用一些不属于主键的列来排列我的行吗?”
你不能。来自关于 SELECT 命令的 DataStax 文档:
ORDER BY 子句只能选择单个列。该列必须是复合主键中的第二列。这也适用于主键中具有两个以上列组件的表。
因此,对于您的第一CREATE
要工作,您需要将主键调整为:
PRIMARY KEY(id,time)
复合主键中的第二列称为“聚集列”。该列决定数据在磁盘上的排序顺序在分区键内。请注意最后一部分是斜体的,因为它很重要。当您通过以下方式查询 Stocks 列族(表)时id
,该列值的所有“行”id
将返回,排序依据time
。在 Cassandra 中,您只能指定分区键内的顺序(而不是整个表),并且您的分区键是复合主键中列出的第一个键。
当然,这样做的问题是你可能想要id
是唯一的(这意味着 CQL 只会为每个分区键返回一“行”列值)。要求time
成为主键的一部分就否定了这一点,并且可以为同一个 id 存储多个值。这是通过唯一 id 分区数据的问题。在 RDBMS 领域这可能是一个好主意,但它可能会使 Cassandra 中的查询变得更加困难。
本质上,您需要在这里重新审视您的数据模型。例如,如果您想查询一段时间内的价格,您可以将该表命名为“StockPriceEvents”,主键为(id,time)
or (symbol,time)
。查询该表将为您提供每个 ID 或符号记录的价格,并按时间排序。现在这对您的用例可能有也可能没有任何价值。只是试图解释主键和排序顺序在 Cassandra 中如何工作。
注意:您确实应该使用具有更多含义的列名称。像“id”、“time”和“timeseries”这样的东西非常模糊,并没有真正描述它们使用的上下文。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)