2013-07-16 4 views
0

Я новичок в CQL & составных ключах (я ранее использовал CLI) Я ищу для реализации своего старого семейства суперколонок с составными ключами. Короче говоря, мой взгляд вверх модель:Cassandra CQL3 Композитные ключи возвращают повторяющиеся значения

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

ответ

2

«Дубликаты» - это потому, что в CQL есть дополнительные столбцы экономии, чтобы хранить дополнительные метаданные. С вашим примером, от Кассандры кли вы можете увидеть, что происходит:

[[email protected]] 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();.

+0

Спасибо за ответ. Вы знаете, какова природа метаданных? – eshalev

Смежные вопросы