2017-08-24 2 views
0

Je cherche un bon moyen de stocker des données spécifiques de temps dans cassandra.Stocker des données spécifiques à temps dans cassandra

Chaque entrée peut ressembler à (start_time, value). Plus tard, je voudrais récupérer la valeur actuelle.

La logique de récupération de la valeur du courant est similaire à la suivante.

  1. Trouvez toutes les lignes avec start_time<=current_time.

  2. Ensuite, trouvez la valeur avec start_time maximum à partir des lignes obtenues à la première étape.

PS: - Edité la question pour le rendre plus clair

+0

Est-ce la requête que vous voulez exécuter? Liste tous les types de requête que vous souhaitez exécuter et modélisez votre table à partir de cette –

+0

Oui, c'est la seule requête que je veux exécuter. – Ravi

+0

Et vous avez besoin de toutes les données précédentes, n'est-ce pas? –

Répondre

0

Créer deux tables séparées comme ci-dessous:

CREATE TABLE data (
    start_time timestamp, 
    value int, 
    PRIMARY KEY(start_time, value) 
); 

CREATE TABLE current_value (
    partition int PRIMARY KEY, 
    value int 
); 

Maintenant, vous devez insérer des données dans les deux table, insérer les données dans la deuxième table utilisent une valeur statique comme 1

INSERT INTO current_value(partition, value) VALUES(1, 10); 

Maintenant Dans la table de valeur actuelle, vos données seront plus élevées et vous obtiendrez la dernière valeur chaque fois que vous sélectionnez.

+0

Cela fonctionnera-t-il si je saisis un futur horodatage? – Ravi

+0

@Ravi current_value table conservera la dernière insertion –

+0

Je pense que la table de données ne permettra pas une requête comme start_time <= current_time. –

1

Les exigences exactes ne sont pas possibles. Mais nous pouvons nous rapprocher d'une colonne de plus. Tout d'abord, pour pouvoir utiliser l'opérateur <=, votre colonne start_time doit être la clé de votre table.

Ensuite, vous avez besoin d'une clé de partition différente. Vous pouvez choisir une valeur fixe mais cela peut poser des problèmes lorsque la partition aura trop de lignes. Ensuite, vous devriez mieux utiliser quelque chose comme l'année ou le mois de start_time.

CREATE TABLE time_specific_table (
    year bigint, 
    start_time timestamp, 
    value text, 
    PRIMARY KEY((year), start_time) 
) WITH CLUSTERING ORDER BY (start_time DESC); 

Le problème est que lorsque vous interrogera la table, vous aurez besoin de connaître la valeur de la clé de partition:

Trouver toutes les lignes avec start_time < = current_time

SELECT * FROM time_specific_table 
WHERE year = :year AND start_time <= :time; 

sélectionner la valeur avec start_time maximum

SELECT * FROM time_specific_table 
WHERE year = :year LIMIT 1; 
+0

'SELECT * FROM time_specific_table OERE année =: année;' cette partie n'est pas claire pour moi. Comment cela va me donner max start_time? – Ravi

+0

Les requêtes que j'ai mentionnées ne sont pas indépendantes. Edited la question pour le rendre plus clair. Merci. – Ravi

+0

@Ravi grâce à l'instruction 'DESC' CLUSTERING ORDER' sur la colonne' start_time', vous obtiendrez la plus grande valeur de 'start_time' avec cette requête. –