【问题标题】:CQL selecting rows without columnsCQL 选择没有列的行
【发布时间】:2013-07-15 15:23:34
【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

    标签: cassandra thrift cql3 cqlsh


    【解决方案1】:

    这就是 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 |
    

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

    【讨论】:

    • 第一个键是分区键。在存储引擎中,分区键用于 cassandra 存储行(不是 CQL 行)。因此,如果我只查询分区键,则没有理由开始序列化列(包含集群键)。我可以更改我的 CQL 查询或 CREATE TABLE 定义中的某些内容,使其不这样做吗?
    • k1 和 k2 是主键的一部分。每次您为主键中的任何变量设置新值时,cassandra 都会创建一个新条目。您可以在查询中使用 SELECT * 来验证这一点。
    • 如果我理解正确,thrift 会将我的模式映射到数据[row_key][k1,k2]。其中 k1 和 k2 的 复合存储为 列名 (每个 k1,k2 对作为单个列名)。我应该如何更改我的架构或查询以反映以下问题:“给我 row_key 的所有值”而不多次获取每个条目?我应该以不同的方式声明 row_key 吗?
    • 您的示例 CREAT TABLE 有 2 列,但您的示例数据有 3。
    • 对不起,我应该说得更清楚。我已经编辑过了。该示例数据是单个存储引擎或旧 cli 架构所代表的内容。
    【解决方案2】:

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

    【讨论】:

    • 是的,这是要走的路。我怎么能错过这个:/事实上,在我的情况下,我正在使用限制查询来检索用户的前 5 个位置。
    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 2013-07-15
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2012-11-28
    相关资源
    最近更新 更多