2012-01-05 3 views
1

임의의 시간에 n 개의 신호를 줄 수있는 장치를 가정합니다. 우리는 일정 기간 동안 m 개의 장치에서이 데이터를 수집합니다. 그래서 우리의 '메타 스키마는'나는 다양한 방법을 이해하려고 노력 카산드라와 임에이 데이터를 넣을카산드라 : 모델링 된 시간 데이터

DeviceId : int 
SignalId : int 
SignalDateTime : DateTime (with mSec as YY-MM-DD HHMMSS.mm) 
ExtraData : String 

입니다. 나는 세 가지 값 (DeviceId, SignalId, SignalDateTime)의 조합으로 데이터를 가져올 수 있기를 원합니다.

DeviceId를 행 키로 사용하고 SignalDateTime : SignalId를 연결한다고 생각해보십시오. 그렇다면 ExtraData로 무엇을해야합니까? 어쩌면 초 컬럼으로 만들 수 있을까요? 마찬가지로 DeviceId와 SignalDateTime을 사용하여 고유 한 행 키를 만들 수도 있지만 이것이 Cassandra를 사용하는 합리적인 방법입니까?

+0

세 가지 값을 조합하여 데이터를 가져와야한다고 할 때 정확히 무엇을 의미합니까? 날짜가 있지만 장치/신호 ID가 없을 수 있으며 특정 날짜가있는 모든 데이터를 가져와야합니다. 또는 신호 ID를 가지고있을 수 있으며 해당 신호 ID뿐만 아니라 해당 신호 ID의 모든 데이터를 가져야합니다. – nickmbailey

+0

@nickmbailey -> 정확하게. – ethrbunny

답변

3

카산드라를 사용하면 실제로 데이터를 작성하려는 다른 쿼리로 시작하여 거기에서 적절한 열 패밀리 정의로 돌아가고 싶습니다. 이상적인 모든 쿼리는 한 행의 데이터 만 선택합니다. 여러 필드에서 여전히 쿼리 할 수있는 상태에서이 작업을 수행하려면 여러 열 패밀리에서 해당 데이터를 비정규 화해야합니다.

다음과 같은 열 가족과 함께 시작할 수 :

CF1 
RowKey: DeviceID 
ColumnNames: SignalDateTime 
Value: Serialized [SignalID + ExtraData] 

CF2 
RowKey: SignalID 
ColumnName: SignalDateTime 
Value: Serialized [DeviceID + ExtraData] 

값은 (JSON, ProtocolBuffers 등을 사용) *의 ID + ExtraData의 일부 직렬화 된 형식이 될 것입니다. 이 스키마를 사용하면 Device1의 모든 데이터 (시간 t0에서 t1까지) 또는 Signal1의 모든 데이터 (t0에서 t1까지)를 쿼리 할 수 ​​있습니다.

아마도 DeviceID 및 SignalID도 t0에서 t1까지 쿼리하고 싶을 것입니다.

CF3 
RowKey: DeviceID 
ColumnName: CompositeColumn[SignalID:SignalDateTime] 
Value: ExtraData 

당신이 당신의 시간 범위 내에서 SignalID에 대한의 DeviceID와 슬라이스 열을 기반으로 행과 시간을 가져올 것이 열 가족을 조회하려면 : 이것은 복합 열을 사용하는 것이 만들 수있는 경우이다. pycassa 문서는 basics of composite columns 중 일부를 설명합니다.

+0

필자는 TimeUUID에 대한 칼럼 분할이 주문한 분할자를 사용하지 않는 한 효과가 없을 것이라고 생각했다. – ethrbunny

+0

열 조각과 행 조각을 혼동하지 마십시오. 행을 슬라이스하려면 순서가 지정된 분할자가 있어야합니다. 그러나 한 행 내의 열은 정렬 된 순서로 저장되므로 열을 분할하면 효율적입니다. – psanford