在cassandra中创建表时出错 - 错误请求:只能在CLUSTERING ORDER directiv中定义聚类键列

Lah*_*iru 9 cql cassandra

当我尝试使用以下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"之类的东西是相当模糊的,并没有真正描述它们被使用的上下文.