2013-09-30 45 views
13

我有这样定义的定制列表表:CQL3:如何在仅有主键时检索TTL?

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插入的数据?通常情况下,如果有一个定制列表列,这不是主键的一部分,那么我可以使用这样的表述:

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

但由于只有主键列,功能类似于ttlwritetime不会工作。除了向不是主键一部分的表中增加一个额外的“虚拟”列之外,我如何获得TTL?

+0

我相信在CQL中没有办法达到这个目的。但是,我可以使用cassandra-cli获得TTL。我想知道:为列名指定TTL是什么意思,这是'D00D'在后端有效的内容。值可能过期,但名称也可以过期?当然,我们可以将值存储在列名称中,但实现(至少是CQL)不考虑该假设。 – Nikhil

+0

在cassandra-cli中,我基本上看到一个空白值的列(名字中有'D00D');这个空值是TTL实际关联的。由于没有非主键CQL列,实际上没有值存储,只有列名。我知道你可以通过cassandra-cli获得TTL,但这不是我的选择,因为我使用Datastax Java驱动程序进行查询。 (应该提到)感谢您的建议。 – Peter

+1

因此,它看起来越来越像我只需添加一个不属于主键的虚拟列,以便能够检索TTL。该虚拟值将始终为空。想想看,无论如何物理存储的方式都没有什么不同:Cassandra将创建一个列名称对应于'clustered_key'中的值的列,但实际值将为空。 – Peter

回答

0

您可以在clustered_key上调用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; 
+0

谢谢,但这是行不通的。使clustered_key列成为主键的一部分的关键在于我需要'clustered_key'的值成为实际列名称的一部分,它利用了行内的列排序。另外,如果'clustered_key'不是主键的一部分,那么我实际上只能为每个'row_key'存储一个值。 – Peter

5

仅仅为了将来的访问者,从2.2开始,如果不添加虚拟列,这仍然是不可能的。

相关问题