【问题标题】:Cassandra Select queryCassandra 选择查询
【发布时间】:2015-05-22 10:20:41
【问题描述】:

在此表中,los.configuration 的分区键包含 3 列(1. groupname 2. class 3.yearofjoining)。可能有 2 类 BPL 和 APL。我想从数据库中选择这两个类别。

所以我必须使用查询:

SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 
AND CLASS IN ('APL','BPL') AND YEAROFJOINING IN (2014,2015);

当我尝试这个查询时,它返回一个错误

Partition KEY部分类不能被IN关系限制(只有partition key的最后一部分可以)。

知道问题出在哪里吗?

【问题讨论】:

  • This is not working 不是一个好问题。它怎么不工作?而且您的问题很可能是因为您没有将键空间添加到列族中。用select * from keyspace.table where condition1 = something 试试看是否可行。
  • 您是否尝试在 where 子句中使用 OR 条件? stackoverflow.com/questions/10139390/…
  • SELECT * from TABLE where condition1 = something or condition1 = something
  • @Getz 虽然这可能适用于 SQL,但不适用于 CQL(Cassandra 查询语言)。
  • 在这个表中 los.configuration 有一个由 3 列组成的分区键。 (1. 组名 2. 班级 3.yearofjoining)。可能有 2 类 BPL 和 APL。我想从数据库中选择这两个类别。 yearofjoining 是一个 int 列表。所以我必须使用查询 SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING IN (2014,2015);当我尝试这个查询时,它返回一个错误,因为分区键部分类不能受 IN 关系限制(只有分区键的最后一部分可以)。知道问题出在哪里吗?

标签: cassandra cql multiple-conditions select-query


【解决方案1】:

这里的主要问题是您试图在composite partition key 的两个部分上使用IN 关系。 IN 只能对分区或集群键的 last 部分进行操作。

为了让您的查询正常工作,您的 PRIMARY KEY 需要在 GROUPNAME 和 CLASS 上进行分区,同时在 YEAROFJOINING 上进行集群:

PRIMARY KEY ((groupname, class), yearofjoining))

当我使用该 PRIMARY KEY 查询您的表时,使用您的原始查询:

aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION 
    WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') 
    AND YEAROFJOINING IN (2014,2015);

 groupname | class | yearofjoining | value
-----------+-------+---------------+-------
       332 |   APL |          2014 | test1
       332 |   APL |          2015 | test3
       332 |   BPL |          2014 | test2

(3 rows)

其他想法:

  1. 我不知道您可以在同一查询中对分区的最后部分和集群键使用IN 关系。所以我今天学到了一些东西!

  2. 我不得不警告您,已知在您的分区键上使用IN 性能不佳 (Is the IN relation in Cassandra bad for queries?)。事实上,多行键查询已被识别为 Cassandra 反模式。

  3. 我对这个问题想得越多,我就越认为如果您对YEAROFJOINING(而不是IN)进行切片查询,您将获得更好的性能。因此,如果您要搜索的年份是有序的,比如 2014 年或更高,那么更好的查询将像这样工作:

    aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;

这会更快,因为 YEAROFJOINING 上的集群键将利用您的磁盘排序顺序。

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 2017-03-12
    • 2016-08-28
    • 2019-03-09
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多