Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select TTL for an element in a map in Cassandra

Tags:

cassandra

cql3

Is there any way to select TTL value for an element in a map in Cassandra with CQL3?

I've tried this, but it doesn't work:

SELECT TTL (mapname['element']) FROM columnfamily
like image 613
MCs88 Avatar asked Jun 11 '13 07:06

MCs88


People also ask

What is default TTL in Cassandra?

To create a new table with default Time to Live (TTL) settings enabled using CQL. Enable TTL when you're creating a new table with the default TTL value set to 3,024,000 seconds, which represents 35 days.

How does Cassandra TTL work?

In Cassandra Both the INSERT and UPDATE commands support setting a time for data in a column to expire. It is used to set the time limit for a specific period of time. By USING TTL clause we can set the TTL value at the time of insertion. We can use TTL function to get the time remaining for a specific selected query.


1 Answers

Sadly, I'm pretty sure the answer is that it is not possible as of Cassandra 1.2 and CQL3. You can't query individual elements of a collection. As this blog entry says, "You can only retrieve a collection in its entirety". I'd really love to have the capability to query for collection elements, too, though.

You can still set the TTL for individual elements in a collection. I suppose if you wanted to be assured that a TTL is some value for your collection elements, you could read the entire collection and then update the collection (the entire thing or just a chosen few elements) with your desired TTL. Or, if you absolutely needed to know the TTL for individual data, you might just need to change your schema from collections back to good old dynamic columns, for which the TTL query definitely works.

Or, a third possibility could be that you add another column to your schema that holds the TTL of your collection. For example:

CREATE TABLE test (
  key text PRIMARY KEY,
  data map<text, text>,
  data_ttl text
) WITH ...

You could then keep track of the TTL of the entire map column 'data' by always updating column 'data_ttl' whenever you update 'data'. Then, you can query 'data_ttl' just like any other column:

SELECT ttl(data_ttl) FROM test;

I realize none of these solutions are perfect... I'm still trying to figure out what will work best for me, too.

like image 50
adrian lange Avatar answered Sep 23 '22 04:09

adrian lange