2013-08-02 3 views
2

다음과 같은 구성의 테이블이 있다고 가정합니다.CQL3 기본 키 변경

CREATE TABLE rollup (
    hashname text, 
    key text, 
    day timestamp, 
    counter_value counter, 
    PRIMARY KEY (hashname, key, day) 
) WITH 
... 

나는 등 (내 생각) 때문에

SELECT * FROM rollup WHERE hashname='some_namespaced_hash' AND day>='2013-07-15' AND day<='2013-07-25'; 

그러나,이 작동하지 않습니다처럼 다음도 >, < 관련이 보이는 쿼리,

를 실행하려면

복합 키는 CQL이 SELECT 쿼리에서도 ORDER BY 구문을 사용하는 것이 합리적이라는 것을 의미하지만 SQL에서 임시 쿼리를 수행 할 때 사용한 것처럼 유연하지는 않습니다. ORDER BY 절은 단일 열만 선택할 수 있으며 해당 열은 복합 PRIMARY KEY의 두 번째 열이어야합니다. 기본 키에 2 개 이상의 열 구성 요소가있는 테이블에도 적용됩니다.

여기에서 day은 기본 열 키의 세 번째 열입니다. 이 작업을 수행하는 유일한 방법은 기본 복합 키를 PRIMARY KEY (hashname, day, key)으로 변경하는 것입니다. 이 작업을 수행하는 방법을 알려주는 설명서를 찾을 수 없습니다. 가능한가?

또는이 문제를 해결하기위한 "올바른"방법이 없거나 문제를 잘못 해석하고 있습니까?

답변

2

맞습니다. 유일한 방법은 기본 키의 순서를 전환하는 것입니다. 그 이유는 현재 귀하의 키 순서에 있다는 것입니다 :

hashname1 key1 day1: counter_value111 
hashname1 key1 day2: counter_value112 
hashname1 key2 day1: counter_value121 
hashname1 key2 day2: counter_value122 
hashname1 key3 day1: counter_value131 
hashname1 key3 day2: counter_value132 

그래서 일의 범위를 검색, 카산드라는 각 키에 대한 '건너 뛰기'로해야합니다. 이는 비효율적이며 지원되지 않습니다. 이 모든 데이터를 다시 작성하는 것입니다 할

hashname1 day1 key1: counter_value111 
hashname1 day1 key2: counter_value121 
hashname1 day1 key3: counter_value131 
hashname1 day2 key1: counter_value112 
hashname1 day2 key2: counter_value122 
hashname1 day2 key3: counter_value132 

불행하게도 유일한 방법 및 카산드라에서이 일을 더 붙박이 방법이 없다 :이 순서대로 있어야합니다. 한 CF에서 데이터를 읽고 순서를 전환 한 다음 새 CF에 쓰고 전환하여 스크립트를 작성할 수 있습니다. 이것이 살아야 할 필요가 있다면 더 어렵지 만 여전히 가능합니다.