0

私はCQLと複合キーを初めて使用します(以前はCLIを使用していました)代わりに複合キーを使用して古いスーパーカラムファミリーを実装しようとしています。要するに、私のルックアップモデルは次のとおりです。

blocks[file_id][position][block_id]=size

複合キーを持つ次の CQL テーブルがあります。

CREATE TABLE blocks (
 file_id text,
 start_position bigint,
 block_id text,
 size bigint,
 PRIMARY KEY (file_id, start_position,block_id)
);

これらのサンプル値を挿入します。

/*Example insertions*/
INSERT INTO blocks (file_id, start_position, block_id,size) VALUES ('test_schema_file', 0, 'testblock1', 500);
INSERT INTO blocks (file_id, start_position, block_id,size) VALUES ('test_schema_file', 500, '2testblock2', 501);

この Astyanax コードを使用してクエリを実行します。

OperationResult result = m_keyspace.prepareQuery(m_BlocksTable).getKey(file).execute();

        ColumnList<BlockKey> columns = (ColumnList<BlockKey>) result.getResult();
        for (Column<BlockKey> column : columns) {
            System.out.println(StaticUtils.fieldsToString(column.getName()));
            try{
            long value=column.getLongValue();
                System.out.println(value);
            }catch(Exception e){
                System.out.println("Can't get size");
            }

        }

結果を反復処理すると、各列に対して 2 つの結果が得られます。「サイズ」を含むものと、「サイズ」列が存在しないもの。

recorder.data.models.BlockKey Object {
  m_StartPosition: 0
  m_BlockId: testblock1
  m_Extra: null
}
Can't get size
recorder.data.models.BlockKey Object {
  m_StartPosition: 0
  m_BlockId: testblock1
  m_Extra: size
}
500
recorder.data.models.BlockKey Object {
  m_StartPosition: 500
  m_BlockId: 2testblock2
  m_Extra: null
}
Can't get size
recorder.data.models.BlockKey Object {
  m_StartPosition: 500
  m_BlockId: 2testblock2
  m_Extra: size
}
501

だから私は2つの質問があります:

  1. 理論的にはサイズ列は必要ありません。複合キーの値である必要があります: blocks[file_id][position][block_id]=size の代わりに blocks[file_id][position][block_id]['size'] = size . . 冗長なサイズ列を作成せずに、このデータを CQL3 に正しく挿入するにはどうすればよいですか?
  2. そのような行を挿入したことがないのに、なぜ「サイズ」のない余分な列を取得するのですか?
4

1 に答える 1

2

「重複」は、CQL を使用すると、余分なメタデータを格納するために挿入された余分なthrift 列があるためです。あなたの例では、cassandra-cli から何が起こっているかを見ることができます:

[default@ks1] list blocks;
------------------- RowKey: test_schema_file
=> (column=0:testblock1:, value=, timestamp=1373966136246000)
=> (column=0:testblock1:size, value=00000000000001f4, timestamp=1373966136246000)
=> (column=500:2testblock2:, value=, timestamp=1373966136756000)
=> (column=500:2testblock2:size, value=00000000000001f5, timestamp=1373966136756000)

CQL を使用してデータを挿入する場合は、CQL も使用してクエリを実行する必要があります。を使用して Astyanax でこれを行うことができますm_keyspace.prepareCqlStatement().withCql("SELECT * FROM blocks").execute();

于 2013-07-16T09:26:25.673 に答える