2012-07-12 2 views
2

각 야간 빌드에 대한 벤치 마크 실행을 저장해야합니다. 이렇게하려면 다음 데이터 모델을 생각해 냈습니다. 복합 열 만들기 cassandra

BenchmarkColumnFamily= { 

    build_1: { 
     (Run1, TPS) : 1000K 
     (Run1, Latency) : 0.5ms 
     (Run2, TPS) : 1000K 
     (Run2, Latency) : 0.5ms 
     (Run3, TPS) : 1000K 
     (Run3, Latency) : 0.5ms 
    } 

    build_2: { 
     ... 
    } 
... 

} 

이러한 스키마를 만들려면, 난에서 다음 명령을 함께했다 카산드라 - CLI :

create column family BenchmarkColumnFamily with 
    comparator = 'CompositeType(UTF8Type,UTF8Type)' AND 
    key_validation_class=UTF8Type AND 
    default_validation_class=UTF8Type AND 
    column_metadata = [ 
    {column_name: TPS, validation_class: UTF8Type} 
    {column_name: Latency, validation_class: UTF8Type} 
    ]; 

위의 명령은 내가 만들려 스키마를 만들 수 있습니까? 내 혼란에 대한 이유는, 내가 위의 CF를 사용하여 데이터를 삽입 할 때 : set BenchmarkColumnFamily['1545']['TPS']='100'; 비교기 유형이 복합되어 있어도 성공적으로 삽입됩니다. 또한 다음 명령도 성공적으로 실행됩니다.

set BenchmarkColumnFamily['1545']['Run1:TPS']='1000'; 

무엇이 누락 되었습니까?

답변

2

나는 당신이 잘못하고 있다고 생각하지 않습니다. CLI는 형식을 기반으로하는 값의 문자열을 구문 분석합니다. 아마도 org.apache.cassandra.db.marshal.AbstractType<T>.fromString()을 사용합니다. 그리고 복합 유형의 경우 필드 구분자로 ':'를 사용합니다 (문서화 된 것이 아니지만 Java 코드를 사용하여 직접 설득했습니다.)

':'이 없으면 그냥 ' . 먼저 복합의 일부, 그리고 널 (null)로 두 번째를 떠나에만 두 번째를 설정하려면, 당신은 CLI에서

set BenchmarkColumnFamily['1545'][':NOT_TPS']='999'; 

를 사용하는 CF 덤프 수 있습니다

list BenchmarkColumnFamily; 

및 모든 볼 수 이름 (모든 행), 예 :

RowKey: 1545 
=> (column=:NOT_TPS, value=999, timestamp=1342474086048000) 
=> (column=Run1:TPS, value=1000, timestamp=1342474066695000) 
=> (column=TPS, value=100, timestamp=1342474057824000) 

복합 요소를 null이 아니거나 특정 값으로 제한하는 방법은 없습니다 (CLI를 통해). 이는 코드에서해야 할 일입니다.

또한 이미 기본 유효성 검사를 UTF8Type으로 나열 했으므로 CF 작성을위한 column_metadata 옵션은 필요하지 않습니다.

2

cassandra-cli 도구는 복합재 처리시 매우 제한적입니다. 또한, 명시 적으로 사용자가 제공 한 합성물의 검증과 관련하여 예기치 않은 일이 카산드라에서 발생할 수 있습니다. 귀하의 상황에 대한 정확한 답을 모르겠지만이 유형의 모델이 이라는 것을 알 수 있습니다. CQL 3 엔진을 사용하면 훨씬 더 쉽게을 사용할 수 있습니다.

CREATE TABLE BenchmarkColumnFamily (
    build text, 
    run int, 
    tps text, 
    latency text, 
    PRIMARY KEY (build, run) 
); 

INSERT INTO BenchmarkColumnFamily (build, run, tps, latency) VALUES ('1545', 1, '1000', '0.5ms'); 

가 그 스토리지 엔진 레이어로 변환하는 방법에 대한 자세한 내용은 this post를 참조하십시오 : 예를 들어

, 모델이 표현 될 수있다.

+0

OP의 스키마와 일치하지 않는다고 생각합니다. 복합 키가 생성됩니다. 자세한 내용은 [이 게시물] (http://www.datastax.com/dev/blog/introduction-to-composite-columns-part-1)의 주석을 참조하십시오. – libjack

+0

복합 Cassandra 키가 아닌 복합 CQL 키를 생성합니다. 스토리지 계층에서 이것은 자신이 가지고있는 것과 같은 복합 열 이름을 생성합니다. 이런 종류의 일에 카산드라 클리를 사용하는 것은 정말로 권장되지 않습니다. (이 게시물은 cql3이 작성되기 전에 작성되었습니다.) –

+0

ok, thanks .. cql3을 좀 더 살펴보아야합니다. 필자는 대부분의 작업에 CLI 및/또는 Java API를 사용하고 있습니다. – libjack