2013-10-15 4 views
4
에서 헥터 클라이언트를 사용하여 복합 키의 첫 번째 구성 요소를 사용하여 행을 가져

내가 rowkey 복합 데이터 유형을 사용하고, 열 가족,카산드라

create column family CompositeTest 
with comparator = 'UTF8Type' 
and key_validation_class = 'CompositeType(UTF8Type,UTF8Type)' 
and default_validation_class = 'UTF8Type'; 

아래이 칼럼 제품군의 샘플 데이터 아래로

입니다
RowKey: s2:2222222 
=> (column=param1, value=value1 
=> (column=param2, value=value2 
=> (column=param3, value=value3 
------------------- 
RowKey: s2:3333333 
=> (column=param1, value=value1 
=> (column=param2, value=value2 
=> (column=param3, value=value3 
------------------- 
RowKey: s2:1111111 
=> (column=param1, value=value1 
=> (column=param2, value=value2 
=> (column=param3, value=value3 
------------------- 
RowKey: s1:3333333 
=> (column=param1, value=value1 
=> (column=param2, value=value2 
=> (column=param3, value=value3 
------------------- 
RowKey: s1:2222222 
=> (column=param1, value=value1 
=> (column=param2, value=value2 
=> (column=param3, value=value3 
------------------- 
RowKey: s1:1111111 
=> (column=param1, value=value1 
=> (column=param2, value=value2 
=> (column=param3, value=value3 

행 키의 첫 번째 구성 요소가 "s1"인 모든 행을 가져오고 싶습니다. Hector 클라이언트를 사용할 수 있습니까? 그렇지 않다면 어떤 cassandra 클라이언트가 가능한가?

나는 다음과 같은 코드를 사용하여 시도,하지만 작동하지 않는 한, 사전에

Composite start = new Composite(); 
     start.addComponent(0, "s1", ComponentEquality.EQUAL); 

     Composite end = new Composite(); 
     end.addComponent(0, "s1", ComponentEquality.GREATER_THAN_EQUAL); 

     RangeSlicesQuery<Composite, String, String> rangeSlicesQuery = HFactory.createRangeSlicesQuery(keyspace, new CompositeSerializer(), StringSerializer.get(), StringSerializer.get()); 
     rangeSlicesQuery.setKeys(start, end); 
     rangeSlicesQuery.setRange("param1", "param3", false, 100); 
     rangeSlicesQuery.setColumnFamily("CompositeTest"); 
     rangeSlicesQuery.setRowCount(11); 
     QueryResult<OrderedRows<Composite, String, String>> queryResult = rangeSlicesQuery.execute(); 

     Rows<Composite, String, String> rows = queryResult.get(); 
     Iterator<Row<Composite, String, String>> rowsIterator = rows.iterator(); 

덕분에 ...

+1

Hector 클라이언트와 Astyanax 클라이언트 모두에서이를 수행 할 수 있습니다. –

+2

가능한 경우 Hector를 사용하여 수행하는 방법을 나에게 알려주십시오. –

답변

1

문제는 행 키에서 슬라이스를 수행하려는 것입니다. Cassandra에서 랜덤 파티셔너 (예 : RandomPartitioner 또는 Murmur3Partitioner)를 사용하는 것은 불가능합니다. 파티셔를 보존하는 명령을 사용하고 있다면 가능할 수도 있습니다. 당신에게는 불행한 존재하지 않는 CompositeKeyPartitioner가 있어야하며 따라서 스스로 작성해야합니다. 그런 다음 데이터에 따라 올바른 토큰을 계산하여 클러스터를 구성해야합니다. 알다시피, 가장 쉬운 방법은 아닙니다.

그러나 키 대신 열 이름에 합성 값을 넣는 경우에도 동일한 작업을 수행 할 수 있습니다. 당신은 당신이 그런 식으로 CF 정의 할 수 있습니다 :

create column family CompositeTest 
    with comparator = 'CompositeType(UTF8Type,UTF8Type)' 
    and key_validation_class = 'UTF8Type' 
    and default_validation_class = 'UTF8Type'; 

과 같은 데이터를 저장 :이 구조 당신이 그것을 아주 쉽게 생각 쿼리와

RowKey: s2 
=> (column=2222222:param1, value=value1 
=> (column=2222222:param2, value=value2 
=> (column=2222222:param3, value=value3 
=> (column=3333333:param1, value=value1 
=> (column=3333333:param2, value=value2 
=> (column=3333333:param3, value=value3 
=> (column=1111111:param1, value=value1 
=> (column=1111111:param2, value=value2 
=> (column=1111111:param3, value=value3 
------------------- 
RowKey: s1: 
=> (column=3333333:param1, value=value1 
=> (column=3333333:param2, value=value2 
=> (column=3333333:param3, value=value3 
=> (column=2222222:param1, value=value1 
=> (column=2222222:param2, value=value2 
=> (column=2222222:param3, value=value3 
=> (column=1111111:param1, value=value1 
=> (column=1111111:param2, value=value2 
=> (column=1111111:param3, value=value3 

, 그리고 당신은 항상 열 슬라이스 수 이름을 사용하여 원하는 간격 내에있는 열만 선택하십시오.

+0

OPP (사용하지 않는 것이 좋습니다 - 전문가 모드 기능)에도 복합 행 키의 일부분에 대해서만 RangeSlicesQuery를 수행 할 수 없습니다. ENTIRE 행 키에 대해 수행해야합니다. 즉, 완성 된 행 키 A에서 완료 행 키 B 사이의 모든 키를 가져와야합니다. – Aaronontheweb

+1

왜 그렇게 말했습니까? 앞에서 말했듯이, 합성 값을 올바르게 정렬 할 수있는 분할기가 있어야하지만, 이는 열 이름과 거의 같은 로직입니다. 사실, 키가 시작하거나 끝나는 지 여부에 따라 값이 ComponentEquality.GREATER_THAN_EQUAL 또는 ComponentEquality.EQUAL 인 복합 키의 빈 부분을 설정해야합니다. 일부는 완벽하게 가능하지만 확실하지는 않습니다. ;) – cesare

+1

이제 생각 해보니, 네 말이 맞아. 너 그렇게 할 수있어. – Aaronontheweb

2

이 모든 클라이언트를 사용하여 카산드라에 수 없습니다. 행 키가 복합 객체로 나타나는 동안 애플리케이션 개발자 인 Cassandra 자체에서 행 키는 Cassandra의 SSTable에 단일 원자 값으로 저장되는 단일 바이트 배열입니다.

의미 만, 전체 키있는 행을 조회 할 키의 단지 일부분 수 있습니다. 그렇지 않으면 일치하는 항목을 찾을 때까지 전체 열 패밀리를 검사해야합니다. 이는 엄청난 비용이 듭니다.

그렇다면 행 키의 일부만 사용하여 열 패밀리의 행을 쿼리 할 수 ​​있어야하는 경우 해당 키 부분에 대해 별도의 인덱스 열 패밀리를 만드는 것이 좋습니다. 이렇게하면 표준 키/열 조회를 사용하여 원시 데이터 열 패밀리에서 조건에 맞는 모든 행을 찾을 수 있습니다.