1

在 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)。

我在这里做错了什么?

4

2 回答 2

2

这就是 CQL3 在内部表示数据的方式。它为列创建分区。您需要了解 CQL3 的存储模型。在 DataStax 博客上有很好的阅读资料。看看这些:

http://www.datastax.com/dev/blog/thrift-to-cql3

http://www.datastax.com/dev/blog/cql3-for-cassandra-experts

编辑:
这里我们处理的是 CQL3 而不是节俭。如果您阅读了我的答案中的第二个链接(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 |

PS实现你想要的;您可以尝试使用集合和地图。他们可能会解决您的问题。

于 2013-07-17T07:40:38.863 回答
1

我目前已通过在我的 SELECT 查询中使用“LIMIT 1”来修复此问题。它仍然序列化一列,但不是整行。这总比没有好。

于 2013-07-23T12:02:21.613 回答