Cassandra CQL3复合键返回重复的值

Cassandra CQL3复合键返回重复的值,cassandra,thrift,cql,astyanax,cql3,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

我不熟悉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");
            }

        }
所以我有两个问题:

  • 理论上我不需要大小列,它应该是复合键的值:blocks[file\u id][position][block\u id]=size,而不是blocks[file\u id][position][block\u id][size']=size。如何在不创建冗余大小列的情况下将此数据正确插入CQL3中
  • 如果我从未插入这样一行,为什么我会得到没有“size”的额外列

  • “重复”是因为使用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(“从块中选择*).execute()

    谢谢你的回答。你知道元数据的本质是什么吗?
    [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)