CQL选择没有列的行

时间:2013-07-17 07:21:44

标签: cassandra thrift cql3 cqlsh

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

我在这里做错了什么?

2 个答案:

答案 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”来解决这个问题。它仍然序列化一列,但不是整行。这总比没有好。