使用Java,我可以扫描Cassandra表并只更新一行的TTL吗?我不想改变任何数据。我只想扫描Cassandra表并设置几行的TTL。
另外,使用java,我可以设置绝对的TTL。例如(2016-11-22 00:00:00)。所以我不想以秒为单位指定TTL,而是指定时间的绝对值。
答案 0 :(得分:10)
Cassandra不允许设置行的TTL值,它只允许为值列设置TTL。
如果您想知道为什么 体验行 到期,这是因为如果所有记录的所有列的值都是TTL,然后当您尝试SELECT
时,该行会消失。
但是,只有使用INSERT
执行USING TTL
时才会出现这种情况。如果您INSERT
没有TTL,然后使用TTL执行UPDATE
,您仍会看到该行,但是会显示空值。以下是一些示例和一些问题:
INSERT
的示例:CREATE TABLE test (
k text PRIMARY KEY,
v int,
);
INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;
... 10 seconds after...
SELECT * FROM test ;
k | v
---------------+---------------
INSERT
和TTL UPDATE
的示例:INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;
UPDATE test USING TTL 10 SET v=0 WHERE k='test';
... 10 seconds after...
SELECT * FROM test;
k | v
---------------+---------------
INSERT
UPDATE
的示例
INSERT INTO test (k,v) VALUES ('test', 1);
UPDATE test USING TTL 10 SET v=0 WHERE k='test';
... 10 seconds after...
SELECT * FROM test;
k | v
---------------+---------------
test | null
现在您可以看到解决问题的唯一方法是使用新的TTL重写所有行的所有列的值。
此外,无法指定明确的到期日期,但您可以使用简单的数学(如其他建议的那样)在秒中获得简单的TTL值。< / p>
查看有关数据过期的官方documentation。不要忘记查看更新TTL的DELETE部分。
HTH。
答案 1 :(得分:2)
您不仅可以更新一行的TTL。您必须更新或重新插入所有列。
您可以选择所有常规列和主键列,然后使用主键更新常规列,或使用第二个TTL重新插入
在Java中,您可以使用以下方法从日期开始计算TTL。
public static long ttlFromDate(Date ttlDate) throws Exception {
long ttl = (ttlDate.getTime() - System.currentTimeMillis()) / 1000;
if (ttl < 1) {
throw new Exception("Invalid ttl date");
}
return ttl;
}
答案 2 :(得分:0)
或者,您可以在创建整个表时为其设置TTL值。
CREATE TABLE test (
k text PRIMARY KEY,
v int,
) WITH default_time_to_live = 63113904;
上面的示例将创建一个表,该表的行将在2年后消失。