Domanda

I am new to CQL & composite keys (I previously used CLI) I am looking to implement my old super-column-family with composite keys instead. In short, my look-up model is:

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

I have the folowing CQL table with composite keys:

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

I insert these sample values:

/*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);

I query using this Astyanax code:

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");
            }

        }

When I iterate over the result, I get 2 results for each column. One that contains a "size", and one where a "size" column doesn't exist.

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

So I have two questions:

  1. Theoretically I do not need a size column, it should be a value of the composite key: blocks[file_id][position][block_id]=size instead of blocks[file_id][position][block_id]['size'] = size. . How do I correctly insert this data in CQL3 without creating the redundant size column?
  2. Why am I getting the extra column without 'size', if I never inserted such a row?
È stato utile?

Soluzione

The 'duplicates' are because, with CQL, there are extra thrift columns inserted to store extra metadata. With your example, from cassandra-cli you can see what's going on:

[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)

If you insert data with CQL, you should query with CQL too. You can do this with Astyanax by using m_keyspace.prepareCqlStatement().withCql("SELECT * FROM blocks").execute();.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top