2013-07-16 109 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'] =大小。 。如何在不創建冗餘大小列的情況下將此數據正確插入到CQL3中?
  2. 爲什麼我沒有'大小'的額外的列,如果我從來沒有插入這樣的行?

回答

2

'重複項'是因爲在CQL中,插入了額外的節儉列來存儲額外的元數據。隨着你的榜樣,從卡桑德拉-CLI你可以看到發生了什麼事情:

[[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查詢過。您可以使用m_keyspace.prepareCqlStatement().withCql("SELECT * FROM blocks").execute();與Astyanax做到這一點。

+0

感謝您的回答。你知道元數據的性質是什麼嗎? – eshalev