当我尝试使用以下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
Run Code Online (Sandbox Code Playgroud)
但是这样可以正常工作,我不能使用一些不属于主键的列来排列我的行吗?
CREATE TABLE timeseries (
... event_type text,
... insertion_time timestamp,
... event blob,
... PRIMARY KEY (event_type, insertion_time)
... )
... WITH CLUSTERING ORDER BY (insertion_time DESC);
Run Code Online (Sandbox Code Playgroud)
Aar*_*ron 10
"我不能使用一些不属于主键的列来排列我的行吗?"
你不能.从SELECT命令的DataStax文档:
ORDER BY子句只能选择一个列.该列必须是复合PRIMARY KEY中的第二列.这也适用于主键中包含两个以上列组件的表.
因此,对于您的第一个CREATE工作,您需要调整您的PRIMARY KEY到此:
PRIMARY KEY(id,time)
Run Code Online (Sandbox Code Playgroud)
复合主键中的第二列称为"聚类列".这是确定分区键中数据的磁盘排序顺序的列.注意最后一部分用斜体字表示,因为它很重要.当您查询Stocks列族(表)时id,id将返回其所有列值的"行" ,并按以下顺序排序time.在Cassandra中,您只能在分区键(而不是整个表)中指定顺序,并且分区键是复合主键中列出的第一个键.
当然,问题在于,您可能希望id是唯一的(这意味着CQL只会为每个分区键返回一行"行"列值).要求time成为主键的一部分否定了这一点,并且可以为同一个id存储多个值.这是通过唯一ID对数据进行分区的问题.在RDBMS世界中它可能是一个好主意,但它可以使Cassandra中的查询更加困难.
基本上,您需要在此处重新访问您的数据模型.例如,如果您想查询价格随着时间的推移,您可以将表命名为"StockPriceEvents",主键为(id,time)或(symbol,time).查询该表将为您提供按时间排序的每个id或符号的记录价格.现在,这可能对您的用例有任何价值,也可能没有任何价值.试着解释一下Cassandra中的主键和排序顺序是如何工作的.
注意:您应该使用具有更多含义的列名.诸如"id","time"和"timeseries"之类的东西是相当模糊的,并没有真正描述它们被使用的上下文.
| 归档时间: |
|
| 查看次数: |
5714 次 |
| 最近记录: |