2011-09-12 8 views
3

내 columnfamily에서 time_uuid 유형을 키로 사용하는 데 문제가 있습니다. 내 기록을 저장하고 삽입 할 때 주문하도록 한 다음 time_uuid가 좋은 방법이라고 생각했습니다. 이것은 내가 내 열 가족을 설정 한 방법입니다pycassa의 시간 UUID 유형

sys.create_column_family("keyspace", "records", comparator_type=TIME_UUID_TYPE) 

내가 삽입 할 때,이 할 : 나는 데이터를 삽입 할 때

그러나
q=pycassa.ColumnFamily(pycassa.connect("keyspace"), "records") 
myKey=pycassa.util.convert_time_to_uuid(datetime.datetime.utcnow()) 
q.insert(myKey,{'somedata':'comevalue'}) 

, 나는 항상 오류를 :

v1 UUID 열 이름 또는 값에 대한 인수가 UUID, datetime 또는 숫자가 아니 었습니다.

comparator_type을 UTF8_TYPE으로 변경하면 작동하지만 항목이 반환 될 때의 순서는 그대로 유지됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

3

열 패밀리의 비교자는 각 행의 열 순서를 지정하는 데 사용됩니다. 'somedata'는 유효한 utf-8이지만 유효한 uuid가 아니기 때문에 오류가 표시됩니다.

cassandra에 저장된 행의 순서는 파티셔에 의해 결정됩니다. 당신이 당신의 클러스터 균등하게 부하를 분산하지만 (행이 임의의 순서로 반환됩니다.) 의미있는 범위 쿼리를 허용하지 않는 RandomPartitioner를 사용하는 대부분의 경우

http://wiki.apache.org/cassandra/FAQ#range_rp

9

문제는 그 데이터 모델 , 시간을 행 키로 사용하고 있습니다. 이것이 가능하더라도 ByteOrderedPartitioner를 사용하지 않는 한 의미있는 순서를 얻지 못합니다.

대부분의 사람들은 시간을 사용하여 시간을 사용하여 열 이름 (행 키가 아님)을 삽입합니다. 이 모델에서, 당신의 삽입 문이 보일 것 같은 : someKey 당신은 삽입하고 전체 시계열 (예를 들어, 사용자 이름)에 관한 핵심

q.insert(someKey, {datetime.datetime.utcnow(): 'somevalue'}) 

. (시간을 UUID로 변환 할 필요가 없다는 것에 유의하십시오. 하나의 값 이상을 저장하려면 수퍼 컬럼 또는 복합 키를 사용하십시오.

실제로 행 키에 시간을 저장하려면 comparator_type이 아니라 key_validation_class을 지정해야합니다. comparator_type은 열 이름의 유형을 설정하고 key_validation_class은 행 키의 유형을 설정합니다.

sys.create_column_family("keyspace", "records", key_validation_class=TIME_UUID_TYPE) 

ByteOrderedPartitioner도 사용하지 않으면 행이 정렬되지 않습니다.

+0

카산드라의 시계열 데이터에 대한 우수한 읽기는 다음에서 찾을 수 있습니다. [http://rubyscale.com] (http://rubyscale.com/blog/2011/03/06/basic-time-series-with) -cassandra /) 및 여기 : [datastax.com] (http://www.datastax.com/dev/blog/advanced-time-series-with-cassandra) – georg

+0

시간을 UUID로 변환 할 수 있습니다 ** column_name 또는 ** 데이터 ** 데이터를 업데이트해야하므로 pycassa가 UUID의 시간 제한이없는 부분에 임의의 바이트를 추가하지 않도록해야합니다. 이렇게하려면'your_time_series_column_family.autopack_names = False'를 설정하고'column_name'을 생성해야합니다 (예 :'pycassa.util.convert_time_to_uuid (time.time()) .bytes'). – georg