当前位置: 首页 > 知识库问答 >
问题:

聚类密钥的范围查询

昝成弘
2023-03-14

我有一个表格,记录在我的网站上执行的用户活动。我的桌子结构看起来像:

CREATE TABLE key_space.log (
    id uuid,
    time bigint,
    ip text,
    url text,
    user_id int,
    PRIMARY KEY (id, time)
) WITH CLUSTERING ORDER BY (time DESC)

现在我想取过去5分钟内收到的所有记录。

为了做同样的事情,我正在使用

select * from key_space.log where 
  time>current_timestamp - 5 minutes ALLOW FILTERING;

但是这个查询没有返回任何结果

共有2个答案

蓬宾白
2023-03-14

表的id作为分区键,time作为集群键。为了在集群键上运行范围查询,还需要指定分区键。所以这个问题应该是

 select * from key_space.log where id="xyz" and time>current_timestamp - 5 minutes ALLOW FILTERING;

这个答案很好地描述了不同的卡桑德拉键。

史经业
2023-03-14

与所有Cassandra模型一样,您需要首先构建一个专门设计用于支持该查询的表。即使您可以使它与当前表一起工作,它也必须扫描集群中的每个节点,这可能会超时(如您所见)。

一种方法是使用时间“bucket”作为分区键。如果你只关心最后5分钟的记录,那么“一天”应该是有效的,只要你每天不获得数以百万计的新记录。如果你这样做了,那么你的“桶”就需要更小的时间

CREATE TABLE log_by_day (
    id uuid,
    day bigint,
    time bigint,
    ip text,
    url text,
    user_id int,
    PRIMARY KEY (day, time, id)
) WITH CLUSTERING ORDER BY (time DESC, id ASC);

现在这样的查询将工作:

aaron@cqlsh:stackoverflow> SELECT day,time,id,user_id FROM log_by_day
  WHERE day=201920 AND time > 1563635871941;

 day    | time          | id                                   | user_id
--------+---------------+--------------------------------------+---------
 201920 | 1563635872259 | 7fef03da-6c23-4bf2-9e98-fd126ab17944 |    1234
 201920 | 1563635872259 | 9a0c49ce-5ad2-45c5-b570-cd9de1c060d1 |    4607
 201920 | 1563635872209 | 9227166e-cda2-4909-b8ac-4168922a0128 |    2112

(3 rows)

专业提示:在一个唯一的id上进行分区对于数据分发非常有用,但在查询灵活性方面并没有太大帮助。

 类似资料:
  • 创建TABLE TABLE(int键、time时间戳、度量浮点、主键(key、time)); 我需要创建一个火花作业,这将读取数据从上一个表,在指定的开始和结束时间戳做一些处理,并刷新结果回Cassandra。 因此,我的spark-cassandra-connector必须对集群cassandra表列进行范围查询。 范围查询的选择性约为1%,不可能在查询中包含分区键。 这两种解决方案哪一种更好?

  • 因此,我尝试使用Spark SQL进行以下查询('timestamp'是分区键): 虽然作业产生200个任务,但查询不会返回任何数据。 另外,我可以保证会返回数据,因为在cqlsh上运行查询(使用'token'函数进行适当的转换)确实会返回数据。 但不幸的是我不知道什么是“过滤器”...

  • 所以我有一张表,它看起来像这样: 我们依赖该表根据进行分页来正确排序。 问题是:当从cassandra返回结果时,看起来它们是根据ASCII值而不是逻辑的A-Z排序进行排序的。-对于观看它的人来说,这在程序上是有意义的,但在逻辑上是不合理的。 是否有一个选项来改变当前聚类顺序的方法? -或者另一种逻辑排序的方法?

  • 是否可以将列作为分区和聚类键?例如, 创建表citylist2(城市varchar,loc list,pop int,zip varchar,state varchar,primary key(city,city,zip)),使用集群顺序BY(城市ASC,zip DESC);

  • **我试图聚合和找到价格范围,如果在基础上的嵌套报价数组(嵌套数组)的sellerInfoES对象。内部字段是"offerPrice"。如何在Elasticsearch中的嵌套数组字段上编写聚合。我尝试了以下查询,但它不工作。获取此错误:解析失败[在[price_ranges]中找到两个聚合类型定义:[嵌套]和[过滤器]] 映射: 查询:

  • 可以对模型的查询和写入操作进行封装,例如: <?php namespace app\index\model; use think\Model; class User extends Model { public function scopeThinkphp($query) { $query->where('name','thinkphp')->field('i