Cassandra CQL3组合键返回重复值

时间:2013-07-16 07:48:33

标签: cassandra thrift cql astyanax 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. 理论上我不需要大小列,它应该是复合键的值:blocks [file_id] [position] [block_id] = size而不是block [file_id] [position] [block_id] ['size' ] =大小。 。如何在不创建冗余大小列的情况下在CQL3中正确插入此数据?
  2. 如果我从未插入过这样的行,为什么我会得到没有'size'的额外列?

1 个答案:

答案 0 :(得分:2)

'duplicates'是因为,使用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进行查询。您可以使用m_keyspace.prepareCqlStatement().withCql("SELECT * FROM blocks").execute();为Astyanax执行此操作。