【问题标题】:CQL3: How to retrieve the TTL when there is only a primary key?CQL3:当只有一个主键时如何获取 TTL?
【发布时间】: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';

但由于只有主键列,ttlwritetime 之类的函数将不起作用。除了在不属于主键的表中添加额外的“虚拟”列之外,我如何获得 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


【解决方案1】:

您可以在 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;

【讨论】:

  • 谢谢,但这行不通。将clustered_key 列作为主键的一部分的全部意义在于,我需要将clustered_key 的值作为实际列名的一部分,这利用了行内的列排序。另外,如果clustered_key 不是主键的一部分,那么每个row_key 只能存储一个值。
【解决方案2】:

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

【讨论】:

  • Ticket 修复此问题似乎仍处于打开状态
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2023-03-31
  • 2016-10-15
  • 2016-04-08
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多