在CQL3中创建表后:
CREATE TABLE data(
row_key text,
k1 text,
k2 text,
PRIMARY KEY (row_key , k1 ,k2 )
);
我想知道该表中存储的所有cassandra行。但是当我在cqlsh中运行它时:
SELECT row_key FROM data;
我收到了许多重复的条目。我基本上得到了我插入的每列的条目。含义:我为每个(k1& k2)获得了row_key的条目。
但我最初的意图是:“给我一个所有分区(行)键的列表”。我也不想序列化所有列(k1和k2)。
我在这里做错了什么?
答案 0 :(得分:2)
这就是CQL3在内部表示数据的方式。它为列创建分区。您需要了解CQL3的存储模型。在DataStax博客上有关于此的非常好的读数。看看这些:
http://www.datastax.com/dev/blog/thrift-to-cql3
http://www.datastax.com/dev/blog/cql3-for-cassandra-experts
编辑:
这里我们处理的是CQL3而不是thrift。如果您阅读我的答案中的第二个链接(cql3-for-cassandra-experts),您将了解在使用CQL3创建表时数据如何存储在存储引擎中。说我们创建了下表:
CREATE TABLE song_tags (
id uuid,
tag_name text,
PRIMARY KEY (id, tag_name)
);
并说我们有以下行,由单个存储引擎代表:
f665cfc469eb | blues | 1973
f665cfc469ea | covers | 2003
这些由CQL3存储如下:
|id | tag_name |
-----------------------------
|f665cfc469eb blues |
|f665cfc469eb | 1973 |
| |
|f665cfc469ea covers |
|f665cfc469ea | 2003 |
现在如果你做一个SELECT * FROM song_tags;这将是输出:
id | column1 | value
--------------------------------------+---------+-------
8a172618-b121-4136-bb10-f665cfc469ea | 2003 |
8a172618-b121-4136-bb10-f665cfc469ea | covers |
a3e64f8f-bd44-4f28-b8d9-f665cfc469eb | 1973 |
a3e64f8f-bd44-4f28-b8d9-f665cfc469eb | blues |
P.S达到你想要的;你可以尝试使用集合和地图。他们可能会解决您的问题。
答案 1 :(得分:1)
我目前通过在SELECT查询中使用“LIMIT 1”来解决这个问题。它仍然序列化一列,但不是整行。这总比没有好。