【发布时间】:2013-10-06 12:58:45
【问题描述】:
我有一个这样定义的 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';
但由于只有主键列,ttl 和 writetime 之类的函数将不起作用。除了在不属于主键的表中添加额外的“虚拟”列之外,我如何获得 TTL?
【问题讨论】:
-
我相信在 CQL 中没有办法实现这一点。但是,我可以使用 cassandra-cli 获取 TTL。我想知道:为列名指定 TTL 是什么意思,这实际上是后端中的“D00D”。值可以过期,但名称也可以过期吗?当然,我们可以将值存储在列名中,但是实现,至少是 CQL,并没有考虑到这个假设。
-
在 cassandra-cli 中,我基本上看到一列(其名称中包含“D00D”),其值为空;这个空白值是 TTL 实际关联的。因为没有非主键 CQL 列,所以实际上没有存储任何值,只有列名。我知道您可以通过 cassandra-cli 获取 TTL,但这不是我的选择,因为我使用 Datastax Java 驱动程序进行查询。 (应该提到)感谢您的建议。
-
所以,它看起来越来越像我只需要添加一个不属于主键的虚拟列,以便能够检索 TTL。此虚拟值将始终为空白。想一想,这实际上与事物的物理存储方式并没有什么不同:Cassandra 将创建一行,其列名对应于
clustered_key中的值,但实际值为空。
标签: cassandra cql3 ttl datastax-java-driver