2017-08-21 1 views
1

J'ai une table comme ci-dessous:Cassandra colonne requête de clé primaire ne peut pas être limitée exception

CREATE TABLE vroctest.sensor_data_3 (
    nodeid text, 
    yyyymmdd int, 
    hour int, 
    minute int, 
    second int, 
    data_timestamp bigint, 
    data_quality double, 
    data_value blob, 
    PRIMARY KEY ((nodeid, yyyymmdd), hour, minute, second, data_timestamp) 

que je dois faire ci-dessous requête

SELECT nodeid, yyyymmdd, hour, minute, second, data_timestamp, data_quality, data_value 
FROM vroctest.sensor_data_3 where nodeid in ('331ea1eb-d536-3f37-ba6b-ae02dbc736a4') and yyyymmdd in (20160701,20160702,20170701) and hour <=24 and hour >=0 and minute <61 and minute >=0 and second >=0 and second< 61 and data_timestamp >= 1467317265000 and data_timestamp <= 1498853265000; 

cependant, il me donne exception

com.datastax.driver.core.exceptions.InvalidQueryException: Clustering column "minute" cannot be restricted (preceding column "hour" is restricted by a non-EQ relation) 
+0

vous ne pouvez pas utiliser la plage de requête sur 'data_timestamp' sans spécifier' heure, minute, seconde' –

+0

même si je restreindre l'heure, minute et seconde, cela me donne une exception, j'ai édité ma question. – Luckylukee

+0

Vous devez spécifier la valeur de l'heure, minute, seconde avec la même relation –

Répondre

2

Tout ce qui suit passe. Les deux premiers sont pédagogiques. Le dernier est un formulaire valide de votre requête complète.

SELECT * FROM sensor_data_3 
    where nodeid in ('331ea1eb-d536-3f37-ba6b-ae02dbc736a4') 
    and yyyymmdd in (20160701,20160702,20170701) 
    and hour in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24) 
    and minute <61 and minute >=0; 


SELECT * FROM sensor_data_3 
    where nodeid in ('331ea1eb-d536-3f37-ba6b-ae02dbc736a4') 
    and yyyymmdd in (20160701,20160702,20170701) 
    and (hour,minute) >= (0,0) 
    and (hour,minute) < (3,15); 


SELECT nodeid, yyyymmdd, hour, minute, second, data_timestamp, data_quality, data_value FROM sensor_data_3 
    where nodeid in ('331ea1eb-d536-3f37-ba6b-ae02dbc736a4') 
    and yyyymmdd in (20160701,20160702,20170701) 
    and (hour,minute,second,data_timestamp) < (24,61,61,1467317265000) 
    and (hour,minute,second,data_timestamp) >= (0,0,0,1498853265000); 

Les heures, minutes, secondes sont discrètes, permettant plus d'une solution. Cassandra, cependant, ne le sait pas et ne veut pas chasser et picorer pour que les données reviennent. Il veut un point de départ et un point de fin par partition. Au moins, c'est un modèle mental qui fonctionne souvent pour moi.

Le lien fourni par Ashraful Islam est excellent.