Составные ключи Cassandra CQL3 возвращают повторяющиеся значения

Я новичок в 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

Итак, у меня есть два вопроса:

  1. Теоретически мне не нужна колонка size, она должна быть значением составного ключа: blocks[file_id][position][block_id]=size вместо blocks[file_id][position][block_id]['size'] = size . . Как правильно вставить эти данные в CQL3, не создавая избыточный столбец размера?
  2. Почему я получаю дополнительный столбец без «размера», если я никогда не вставлял такую ​​​​строку?

person eshalev    schedule 16.07.2013    source источник


Ответы (1)


«Дубликаты» возникают из-за того, что в CQL вставлены дополнительные столбцы бережливости для хранения дополнительных метаданных. На вашем примере из 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();.

person Richard    schedule 16.07.2013
comment
Спасибо за ответ. Знаете ли вы, какова природа метаданных? - person eshalev; 16.07.2013