2010-12-27 3 views
2

나는 cassandra를 사용하고 있으며 주어진 타임 스탬프 범위 사이에있는 레코드를 가져 오려고합니다. 이것에 대한 질문은 무엇일까요? 저주받은 고객을 사용하고 있습니다.cassandra에서 주어진 타임 스탬프로 레코드를 가져 오는 중

이 코드를 사용해 보았습니다.

String columnFamily = "UserColumnFamily"; 
String keyspace="Enterprise"; 
final String UTF8 = "UTF8"; 
String keyUserid="1"; 
TTransport tr = new TSocket("10.10.10.104", 9160); 
TProtocol proto = new TBinaryProtocol(tr); 
Cassandra.Client client = new Cassandra.Client(proto); 
SlicePredicate predicate = new SlicePredicate(); 
    SliceRange sliceRange = new SliceRange(); 
String startkey="1293443184521000"; 
String finishkey ="1293445102333000";   
sliceRange.setStart(new byte[0]); 
     sliceRange.setFinish(new byte[0]); 
predicate.setSlice_range(sliceRange); 
     ColumnParent parent = new ColumnParent(columnFamily); 
     try { 
    tr.open(); 
    List<KeySlice> results=client.get_range_slice(keyspace,parent,predicate,startkey,finishkey,100, ConsistencyLevel.ONE); 
     for (KeySlice result : results) { 
      Column column = (Column) result.columns; 
      System.out.println(new String(column.name,UTF8) + " ->> " 
      + new String(column.value,UTF8)); 
     } 
     tr.close(); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

그러나이 오류가 발생합니다 :

InvalidRequestException(why:start key's md5 sorts after end key's md5. 
This is not allowed; you probably should not specify end key at all, under RandomPartitioner 

을 그리고 넣으면 finishkey 다음 말한다 null에 : 나는 startkey로 설정 할 값을 이해하지

Required field 'finish_key' was not present! 
    Struct: get_range_slice_args(keyspace:NiidleEnterprise, 
    column_parent:ColumnParent(column_family:UserColumnFamily), 
    predicate:SlicePredicate(slice_range:SliceRange(start:, finish:, reversed:false, count:100)), 
    start_key:1293443184521000, finish_key:null, row_count:100, consistency_level:ONE)" 

finishkey. 위의 코드에서 :

String startkey="1293443184521000"; 
String finishkey ="1293445102333000"; 

이들은 소인 값이다. 시작 및 종료 키를 위해 무엇을 취해야하는지 제안하십시오.

+0

어떤 클라이언트를 사용하고 있습니까? 그 정보는 훨씬 더 유용한 질문이 될 것입니다. –

답변

5

Hector, a java client library for Cassandra 또는 여기에 사용할 수있는 다른 클라이언트 중 하나를 사용하십시오. Raw Thrift를 사용하는 것은 천천히, 힘들고, 잡았다.

그러나 일반적으로 RandomPartitioner를 사용하면 행의 MD5 해시에 따라 순서가 정해지기 때문에 의미있는 행 범위를 얻을 수 없습니다. 대신 열 이름에 타임 스탬프 또는 TimeUUID를 사용하여 행 (또는 여러 행) 내에서 타임 라인을 만들어야합니다. 그러면 열이 시간순으로 정렬됩니다. 그런 다음 데이터를 열 값으로 저장하거나 실제 데이터 행의 키를 열 값으로 저장할 수 있습니다.

2

주어진 열의 충돌 해결을위한 타임 스탬프가 있습니다. 그들은 수색을 위해 거기 있지 않습니다. 타임 스탬프로 검색하려면 타임 스탬프를 데이터 모델 (키, 열 이름 또는 열 값)에 넣어야합니다.

0

Cassandra가 자동으로 수행하는 열 이름 정렬을 활용하려면 타임 스탬프를 열 이름으로 사용할 수 있습니다. 다음 질문은 관련된 행 크기입니다. 모든 행간 데이터를 한 행에 저장하지 못할 수도 있습니다. 데이터를 여러 행으로 나누어야 할 수도 있습니다.

생성되는 데이터의 양에 따라 다른 옵션을 선택할 수 있습니다. 앞서 언급했듯이 매일 데이터를 별도의 행에 저장하고 데이터를 행 이름별로 정렬하여 저장할 수 있습니다. 이 경우 검색어의 시간 범위가 일일 경계에 걸쳐있는 경우 각 행 (즉, 기간 범위의 요일)마다 여러 개의 검색어를 만들어야합니다. 기본적으로 원래 범위 쿼리는 여러 범위 쿼리로 변환됩니다.

관련 문제