CQL3:当只有一个主键时如何检索TTL?

18

我有一个像这样定义的CQL表:

CREATE table primary_key_only(
  row_key varchar,
  clustered_key varchar,
  primary key(row_key, clustered_key)
)
假设我像这样插入值:
INSERT INTO primary_key_only (row_key, clustered_key) VALUES ('FACE', 'D00D') USING TTL 86400;

我该如何获取插入数据的 TTL 值?通常情况下,如果有一个不是主键的 CQL 列,我可以使用以下语句:

SELECT ttl(<column_name>) FROM table WHERE row_key='key';

但由于只有主键列,因此像ttlwritetime这样的函数将不起作用。那么除了向表中添加一个非主键的“虚拟”列之外,我如何获得TTL呢?


我相信在CQL中没有实现这个功能的方法。但是,我可以使用cassandra-cli获取TTL。我想知道:指定列名的TTL是什么意思,因为在后端,“D00D”实际上就是一个列名。一个值可以过期,但是一个名称也可以过期吗?当然,我们可以将值存储在列名中,但是至少在CQL的实现中,它并不考虑这种假设。 - Nikhil
在cassandra-cli中,我基本上看到一个列(其名称中包含“D00D”),其值为空;这个空值实际上与TTL相关联。因为没有非主键CQL列,所以实际上没有存储任何值,只有列名。我知道你可以通过cassandra-cli获取TTL,但对我来说不是一个选项,因为我正在使用Datastax Java驱动程序进行查询。(应该提到)感谢您的建议。 - Peter
1
所以,看起来我只需要添加一个虚拟列,它不是主键的一部分,只是为了能够检索TTL。这个虚拟值将始终为空白。想想看,实际存储方式也并没有那么不同:Cassandra将创建一个行,其中列名对应于clustered_key中的值,但实际值将为空。 - Peter
2个回答

8

为了方便未来的访问者,截至2.2版本,如果不添加一个虚拟列,则无法实现此操作。


修复此问题的工作票似乎仍然是开放的。 - Murali KG

0

你可以在聚集键上调用ttl,但它是主键的一部分。

也许聚集键不需要成为你的主键的一部分?

CREATE table primary_key_only(
  row_key varchar primary key,
  clustered_key varchar
);

INSERT INTO primary_key_only(row_key, clustered_key) VALUES('FACE', 'D00D') USING TTL 86400;

SELECT row_key, clustered_key, ttl(clustered_key) FROM primary_key_only;

谢谢,但这样行不通。将clustered_key列作为主键的一部分的整个意义在于我需要clustered_key的值成为实际列名的一部分,这利用了行内列排序的优势。此外,如果clustered_key不是主键的一部分,那么我真的只能每个row_key存储一个值。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接