2

夜間のビルドごとにベンチマークの実行を保存する必要があります。これを行うために、次のデータモデルを思いつきました。

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: {
       ...
    }
...

}

このようなスキーマを作成するために、cassandra-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';

何が欠けているのですか?

4

2 に答える 2

2

cassandra-cli ツールは、コンポジットの処理が非常に制限されています。また、明示的なユーザー提供のコンポジットの検証に関して、Cassandra で予期しないことが発生する可能性があります。あなたの状況に対する正確な答えはわかりませんが、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');

これがストレージ エンジン レイヤーにどのように変換されるかについて詳しくは、この投稿を参照してください。

于 2012-07-13T16:33:54.220 に答える
2

あなたが何か間違ったことをしているとは思いません。CLI は、おそらく を使用して、タイプに基づいて値の文字列を解析していますorg.apache.cassandra.db.marshal.AbstractType<T>.fromString()。また、複合型の場合は、フィールド セパレータとして「:」を使用します (文書化されているのを見たことはありませんが、自分自身を納得させるために Java コードを試してみました。

「:」がないと、コンポジットの最初の部分が設定され、2 番目の部分が null のままになっているように見えます。秒のみを設定するには、次を使用できます

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

CLI から、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 オプションは不要です。

于 2012-07-16T21:29:21.863 に答える