2012-12-04 2 views
1

[timestamp, long]과 같은 복합 키를 사용하여 열 패밀리를 만들고 쿼리해야합니다. 또한, 질의하는 동안 timestamp (xxx와 yyy 사이의 타임 스탬프와 같은)에 대한 범위 쿼리를 실행하고 싶습니다. 이것이 가능합니까?cassandra 열 패밀리/hector의 키로 타임 스탬프/날짜

현재 나는 정말 재미있는 일을하고 있습니다. 내가 주어진 범위에 대한 타임 스탬프 문자열과 키를 생성하고 긴 함께 연결할 수 있습니다.

like , 
1254345345435-1234 
3423432423432-1234 
1231231231231-9999 

및 키 집합을 hector api로 전달하십시오. (1 개월 동안 날짜 범위가 있고 모든 분 데이터를 원할 경우 30 * 24 * 60 * [2 차 키의 수 - 긴])

복합 키와의 연결 문제를 해결할 수 있습니다. 그러나 질의 부분은 내가 이해하려고 노력하는 부분입니다.

우리가 알고있는 한 RandomPartitioner를 사용할 때 우리는 키가 MD5 체크섬이므로 범위를 기반으로 실제로 쿼리 할 수 ​​없습니다. 이런 종류의 사용 사례에 이상적인 디자인은 무엇입니까? 다음과 같이

내 스키마 및 요구 사항은 다음과 같습니다 키 다음 (다중 키의를 통과 할 수 타임 스탬프 및 열 이름과 같은 긴 값이 (실제 CSH)는 넓은 행을 사용하지 않는 이유는

CREATE TABLE report(
     ts timestamp, 
     user_id long, 
     svc1 long, 
     svc2 long, 
     svc3 long, 
     PRIMARY KEY(ts, user_id)); 

select from report where ts between (123445345435 and 32423423424) and user_id is in (123,567,987) 
+0

임의적 분할 자와 함께 행키 범위 쿼리를 올바르게 이해했습니다. – tysonjh

+0

@ tysonjh 그런 경우의 대안은 무엇입니까? 나는 꽤 일반적인 경우라고 생각합니다 ... 간단한 타임 라인 차트. –

+0

스키마를 쿼리 할 방법을 모델링 한 후에 스키마를 모델링해야하므로 원하는 정밀도로 쿼리 할 수있는 적절한 세분성을 사용하여 쿼리 범위를 지정하려는 값에 역 (역변환 된 역 색인) 인덱스를 만듭니다. – tysonjh

답변

-1

, timestamp 's)를 getKeySlice로 설정하고 거기에 여러 개의 열을 withColumnSlice (id)로 선택하십시오.

필자는 열 이름과 값이 무엇인지 알지 못하기 때문에 이것이 도움이 될 수 있다고 생각합니다. 컬럼 패밀리 정의에 대한 더 자세한 정보를 제공 할 수 있습니까?

+0

타임 스탬프에서 범위 쿼리를 원하기 때문에 작동하지 않습니다. –

+0

@rs_atl 내 이해에 따라 키가 md5이므로 범위 쿼리를 실행할 수 없습니다 ... 맞습니까? 아니면 대안이 있습니다 .... 간단한 시나리오는 타임 라인 차트를 표시하는 것입니다. 컬럼 패밀리를 설계하는 더 좋은 방법이 있습니까? @ user1793389 어쨌든 모든 키를 올바르게 전달해야합니까? –

+0

정확합니다. ByteOrderedPartitioner를 사용하여 키에 대한 범위 쿼리를 수행 할 수 있지만 클러스터가 거의 불균형 해지기 때문에 이는 잘못된 생각입니다. 대안은 내 대답에서 제안한 것입니다. –

2

복합 키의 첫 번째 구성 요소에 대해 범위 쿼리를 수행 할 수 없습니다. 대신, daystamp (현재 자정에 유닉스 에포크)와 같은 센티널 값을 키로 작성한 다음 복합 열을 timestamp : long으로 작성해야합니다. 이 방법으로 범위를 구성하는 키를 제공하고 복합 열의 타임 스탬프 구성 요소를 분할 할 수 있습니다.

+1

승리를 위해 비정규 화하십시오! – tysonjh

1

비정규 화! 수행하려는 u 리 유형을 사용할 수 있도록 스키마를 모델링해야합니다. 우리는 그러한 시나리오를 위해 역 (역변환, 반대의) 색인을 생성합니다.

CREATE TABLE report(
    KEY uuid PRIMARY KEY, 
    svc1 bigint, 
    svc2 bigint, 
    svc3 bigint 
); 

CREATE TABLE ReportsByTime(
    KEY ascii PRIMARY KEY 
) with default_validation=uuid AND comparator=uuid; 

CREATE TABLE ReportsByUser(
    KEY bigint PRIMARY KEY 
)with default_validation=uuid AND comparator=uuid; 

멋진 설명은 here을 참조하십시오. 지금하고있는 일은 times 테이블에 자신의 ascii 키를 생성하여 자신이 원하는 범위 슬라이스 쿼리를 수행 할 수있게합니다. 직접 슬라이스 키를 프로그래밍 방식으로 생성하는 데 사용할 수 있더라도 ascii 일 필요는 없습니다. .

이 방법을 사용하면 모든 쿼리를 쉽게 처리 할 수 ​​있습니다.이 방법은 응용 프로그램에 직접 적용되지는 않지만 아이디어는 동일합니다. 위의 각 표의 열 키에 의미있는 값을 추가하여 더 많은 것을 짤 수 있습니다.

cqlsh:tester> select * from report; 
KEY         | svc1 | svc2 | svc3 
--------------------------------------+------+------+------ 
1381b530-1dd2-11b2-0000-242d50cf1fb5 | 332 | 333 | 334 
13818e20-1dd2-11b2-0000-242d50cf1fb5 | 222 | 223 | 224 
13816710-1dd2-11b2-0000-242d50cf1fb5 | 112 | 113 | 114 


cqlsh:tester> select * from times; 
KEY,1212051037 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 | 1381b530-1dd2-11b2-0000-242d50cf1fb5,1381b530-1dd2-11b2-0000-242d50cf1fb5 
KEY,1212051035 | 13816710-1dd2-11b2-0000-242d50cf1fb5,13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 
KEY,1212051036 | 13818e20-1dd2-11b2-0000-242d50cf1fb5,13818e20-1dd2-11b2-0000-242d50cf1fb5 

cqlsh:tester> select * from users; 
KEY   | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5 
-------------+--------------------------------------+-------------------------------------- 
23123123231 | 13816710-1dd2-11b2-0000-242d50cf1fb5 | 13818e20-1dd2-11b2-0000-242d50cf1fb5