효율적으로 모델을 작성하는 것은 이상한 일입니다.
저는 카산드라의 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) 등을해야합니다. 노드가 로컬 데이터 만 인덱싱하고 대부분의 상용구 인덱싱 코드가 처리되기 때문에 기본 제공 보조 인덱스 방식이 더 좋습니다.