2016-04-04 15 views
0

ベンチマークの目的で、1バイトの56K列を持つCassandra2のテーブルが必要です。多くの列を持つテーブルを作成するCassandra 2

私はこのようなこの要件を「USERTABLE」を作成しようとしています:

create table usertable (
    y_id varchar primary key, 
    field0 varchar, 
    field1 varchar, 
    field2 varchar, 
    ... 
    ... 
    field55999 varchar, 
    field56000 varchar); 

私はCQLSHを使用してファイルからこれを実行しようと、それは応答せずに永遠に実行され、多くのメモリを割り当てます。

これを行うには、より良い方法がありますか?フラットファイル(例えばschema.cql)でご自分のCREATE TABLE文を配置し、彼らところでcqlsh -f schema.cql

を実行し、56kの列に

答えて

2

てみ巨大で、まったく正気開発者がこれまでに作成しません1k以上の列を持つテーブル...このシナリオで何をテストしてアサーションしようとしていますか?

は----第一コメント回答 -

スキーマの生データは、とにかくディスク上のbyte[]として書かれているので、すべてのメタデータについてです。テーブルに列があるほど、メタデータは大きくなります。

取得中だから、私は選択クエリ(心の中でパフォーマンスを維持する)で特定の列名を渡しますので、文句を言わないそれはそれほど単純ではありませんすべての列

を取得します。すべての56k列はディスク上に連続して格納されます。データを読み取るとき、Cassandraには、パーティションキーとクラスタリング列をスキップする索引構造があります。通常の列の場合は、クライアントが要求した列を正確に取得するためのインデックスがありません。たとえば、SELECT field1293 FROM usertable WHERE y_id = xxxを実行している場合、Cassandraはfield1からブロック全体をスキャンしてからピックアップ前にメモリにfield56000までスキャンする必要があります右の列と、これは非常に非常に恐ろしく非効率的ある

--- N番目のコメントを回答 - 私はそれは/非常に遅く、非効率的になる同意しませんが、私はこのシナリオを実現するために必要

遺伝子型データをシミュレートする。

私はこのスキーマを試してみて、テストすることをお勧めします:

create table usertable (
    y_id varchar, 
    field_index int, 
    field_value varchard, 
    PRIMARY KEY(y_id, field_index) 
); 

//INSERT/UPDATE data into field N 
INSERT INTO usertable(y_id, field_index, field_value) 
VALUES('xxx', N, 'fieldN value'); 

//DELETE field N 
DELETE FROM usertable WHERE y_id='xxx' AND field_index=N; 

// Read EXACTLY field N 
SELECT field_value FROM usertable WHERE y_id='xxx' AND field_index=N; 

// Read field N to M, N <= M 
SELECT field_value FROM usertable WHERE y_id='xxx' 
AND field_index >=N 
AND field_index <= M; 

あなたはそれが私がそうする場合の罰則は何ですか

+0

wayyyyyyy良い作品がわかりますか?パーティションあたり20億個のセルがcassandraによってサポートされているためです。したがって、取得中は、特定の列名を選択クエリ(パフォーマンスを念頭に置いておく)に渡して、すべての列を取得しないようにします。このタイプの醜いスキーマに対する影響または症状は何でしょうか。余りに広い行のための影響? –

+1

上記の答えを参照してください。 – doanduyhai

+0

クエリ 'SELECT field56000 FROM usertable WHERE y_id = xxx'を考えてみましょう。上記のクエリを実行しようとすると、56000列がメモリにロードされ、field56000列名に達するまで順次スキャンが実行されます。これはあなたが正確に意味するものですか?私が間違っているなら、私を訂正してください。 –

関連する問題