2011-01-12 2 views
6

시간 범위와 관련된 데이터를 저장하여 나중에 효율적으로 검색 할 수있는 좋은 방법을 찾고 있습니다.카스 산드라에 시간 범위 저장하기

데이터의 각 항목은 (start time, end time, value)으로 단순화 할 수 있습니다. 나중에 (x, y) 범위 내에있는 모든 항목을 검색해야합니다. SQL에서 쿼리는 당신이 날 효율적으로 이러한 쿼리를 수행 할 수 있도록 할 카산드라의 데이터 구조를 제안 할 수

SELECT value FROM data WHERE starttime <= x AND endtime >= y

같은 것입니까?

답변

6

효율적으로 모델을 작성하는 것은 이상한 일입니다.

저는 카산드라의 2 차 인덱스 (불행히도 현재 필요로하는 더미 인덱스 값과 함께)를 사용하는 것이 최선의 선택이라고 생각합니다. '시작', '끝'및 '더미'와 같이 세 개의 열이있는 이벤트 당 하나의 행을 사용해야합니다. 각각에 보조 색인을 작성하십시오. 처음 두 개는 LongType이 될 수 있고 마지막 두 개는 BytesType이 될 수 있습니다. 자세한 내용은 this post on using secondary indexes을 참조하십시오. 보조 색인 질의 (적어도 언급 한 불행한 요구 사항)에 대해 적어도 하나의 열에 EQ 표현식을 사용해야하므로 EQ는 항상 '더미'에있게됩니다. 즉, EQ 색인 표현식 본질적으로 아무 작업이 아니어도됩니다.) 이벤트 데이터의 나머지 부분을 시작, 끝 및 더미와 함께 행에 저장할 수 있습니다. pycassa에서

, 파이썬 카산드라 클라이언트, 당신의 쿼리는 다음과 같습니다

from pycassa.index import * 
start_time = 12312312000 
end_time = 12312312300 
start_exp = create_index_expression('start', start_time, GT) 
end_exp = create_index_expression('end', end_time, LT) 
dummy_exp = create_index_expression('dummy', 0, EQ) 
clause = create_index_clause([start_exp, end_exp, dummy_exp], count=1000) 
for result in entries.get_indexed_slices(clause): 
    # do stuff with result 

다른 클라이언트에서 비슷한 일이 있어야합니다.

내가 처음에 고려한 대안은 거의 항상 나쁜 것인 OrderPreservingPartitioner입니다. 인덱스의 경우 시작 시간을 행 키로, 종료 시간을 열 이름으로 사용합니다. 그런 다음 start_key = start_time 및 column_finish = finish_time을 사용하여 범위 슬라이스를 수행 할 수 있습니다. 이렇게하면 시작 시간 이후의 모든 행을 검색하고 finish_time 이전의 열이있는 행만 반환합니다. 매우 효율적이지 않고 큰 멀티 겟 (multiget) 등을해야합니다. 노드가 로컬 데이터 만 인덱싱하고 대부분의 상용구 인덱싱 코드가 처리되기 때문에 기본 제공 보조 인덱스 방식이 더 좋습니다.