2013-09-30 16 views
13

Ho una tabella CQL definita in questo modo:CQL3: come recuperare il TTL quando c'è solo una chiave primaria?

CREATE table primary_key_only(
    row_key varchar, 
    clustered_key varchar, 
    primary key(row_key, clustered_key) 
) 

Supponendo inserisco valori come questo:

INSERT INTO primary_key_only (row_key, clustered_key) VALUES ('FACE', 'D00D') USING TTL 86400; 

Come potrei fare per il recupero della TTL per i dati inseriti? Normalmente, se ci fosse una colonna CQL che non faceva parte della chiave primaria, quindi potrei usare una dichiarazione come:

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

Ma dal momento che ci sono solo colonne chiave primaria, funzioni come ttl e writetime no lavoro. Come posso ottenere il TTL, oltre ad aggiungere una colonna "fittizia" aggiuntiva alla tabella che non fa parte della chiave primaria?

+0

Credo non ci sia un modo per ottenere questo in CQL. Tuttavia, sono in grado di ottenere il TTL usando cassandra-cli. Mi chiedo: cosa significa specificare il TTL per il nome di una colonna, che è ciò che 'D00D' è effettivamente nel back-end. Un valore può scadere, ma può anche scadere un nome? Naturalmente, possiamo memorizzare valori nel nome della colonna, ma l'implementazione, almeno CQL, non tiene conto di questa ipotesi. – Nikhil

+0

In cassandra-cli, fondamentalmente vedo una colonna (il cui nome ha 'D00D' in esso) con un valore vuoto; questo valore vuoto è ciò a cui il TTL è effettivamente associato. Perché non ci sono colonne CQL chiave non primaria, nessun valore viene effettivamente memorizzato, solo i nomi delle colonne. So che è possibile ottenere il TTL tramite cassandra-cli, ma non è un'opzione per me poiché sto utilizzando il driver Java Datastax per eseguire una query. (Dovrebbe aver menzionato) Grazie per il vostro consiglio. – Peter

+1

Quindi, sembra sempre di più che dovrò semplicemente aggiungere una colonna fittizia che non fa parte della chiave primaria, solo per poter recuperare il TTL. Questo valore fittizio sarà sempre vuoto. Vieni a pensarci, non è poi così diverso da come le cose vengono fisicamente archiviate: Cassandra creerà una riga con i nomi delle colonne corrispondenti al valore in 'clustered_key', ma il valore effettivo sarà vuoto. – Peter

risposta

0

È possibile chiamare ttl su cluster_key tranne per il fatto che fa parte della chiave primaria.

Forse la chiave cluster non deve essere parte della chiave primaria?

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

Grazie, ma questo non funzionerà. L'intero punto in cui la colonna 'clustered_key' fa parte della chiave primaria è che ho bisogno del valore di' clustered_key' per far parte del nome effettivo della colonna, che sfrutta l'ordine delle colonne all'interno delle righe. Inoltre, se 'clustered_key' non fa parte della chiave primaria, allora posso davvero memorizzare solo un valore per' row_key'. – Peter

5

Solo per il gusto di eventuali futuri visitatori, a partire da 2.2 questo non è ancora possibile senza l'aggiunta di una colonna fittizia.