Cassandra和<=,=>运算符的日期不允许过滤

你做到了

我是cassandra的新手,但我不明白为什么我不能按日期过滤(想在日期之间返回结果),例如:

CREATE TABLE test.service_bar(
    service_bar_id UUID,
    start_date_time timestamp,
    end_date_time timestamp,
    title varchar,
    message text,
    is_active boolean,
    PRIMARY KEY((start_date_time, end_date_time))
);

然后这项工作:

  SELECT start_date_time, end_date_time, is_active, message, service_bar_id, title
  FROM test.service_bar
  WHERE start_date_time = '2019-10-30 14:10:29'  AND end_date_time = '2019-10-30 14:10:29'
  LIMIT 500;

但是这个

  SELECT start_date_time, end_date_time, is_active, message, service_bar_id, title
  FROM test.service_bar
  WHERE start_date_time >= '2019-10-30 14:10:29'  AND end_date_time <= '2019-10-30 14:10:29'
  LIMIT 500;

我不能使用 ALLOW FILTERING

我如何在Cassandra中进行此类查询?

亚伦

我不明白为什么我不能按日期过滤(想在日期之间返回结果)

您看到的行为是由于以下原因:

PRIMARY KEY((start_date_time, end_date_time))

您已定义start_date_timeend_date_time作为复合分区键。由于Cassandra使用分布式哈希来确保正确的数据分布,因此分区不会按其值的顺序存储。它们由分区键哈希标记值存储您可以通过使用token分区键上的函数来查看此信息

aaron@cqlsh:stackoverflow> SELECT token(start_date_time,end_date_time),start_date_time,end_date_time,service_bar_id FROM service_bar ;

 system.token(
     start_date_time,
     end_date_time)   | start_date_time                 | end_date_time                   | service_bar_id
----------------------+---------------------------------+---------------------------------+--------------------------------------
    26346508703811310 | 2019-10-30 19:10:29.000000+0000 | 2019-10-30 19:10:29.000000+0000 | 49a70440-8689-4248-b389-13b8d0373e58
  1488616260313758762 | 2019-11-01 19:10:29.000000+0000 | 2019-11-01 19:10:29.000000+0000 | b0bab610-a285-41e7-ba5c-d56f8fb12f52
  2185622653117187064 | 2019-10-30 21:10:29.000000+0000 | 2019-10-30 21:10:29.000000+0000 | 3686c6a6-fd8d-4247-b501-964363a48f63
  7727638696734890177 | 2019-10-30 20:10:29.000000+0000 | 2019-10-30 20:10:29.000000+0000 | 97fc799e-fb54-4b7f-956e-f06bcb9e9d9d

(4 rows)

这是行的默认顺序。这样做是因为每个节点负责特定的令牌范围,以确保数据在多节点群集中尽可能均匀地分布(这是通常的生产用例)。因此,CQL在查询分区键的方式上有一些限制。这些限制是为了避免编写错误查询而存在的,例如不允许对分区键进行范围查询。

我如何在Cassandra中进行此类查询?

这还应该告诉您,您应该构建表和查询,以确保可以通过对单个节点的请求来实现它们。鉴于此,您的用例仅在更改分区键时才有效。

开发团队实施像您这样的解决方案的一种方法是使用一种称为“时间存储”或有时只是“存储”的建模技术。在这种情况下,假设您每月写的条目永远不会超过几千条。也许不是这样,但在本示例中将使用它。然后,我可以按月进行分区,然后将这些_time列用作聚类键。

CREATE TABLE stackoverflow.service_bar_by_month (
    month_bucket int,
    start_date_time timestamp,
    end_date_time timestamp,
    is_active boolean,
    message text,
    service_bar_id uuid,
    title text,
    PRIMARY KEY (month_bucket, start_date_time, end_date_time)
) WITH CLUSTERING ORDER BY (start_date_time DESC, end_date_time DESC);

这将所有行一起通过的值存储month_bucket,并且每个分区中,行将由被排序start_date_timeend_date_time以递减的顺序。现在这有效:

aaron@cqlsh:stackoverflow> SELECT start_date_time, end_date_time, is_active, message, service_bar_id, title
                 ... FROM service_bar_by_month
                 ... WHERE month_bucket = 201910 AND start_date_time >= '2019-10-30 14:10:29'  AND start_date_time <= '2019-10-31 23:59:59';

 start_date_time                 | end_date_time                   | is_active | message           | service_bar_id                       | title
---------------------------------+---------------------------------+-----------+-------------------+--------------------------------------+--------
 2019-10-30 21:10:29.000000+0000 | 2019-10-30 21:10:29.000000+0000 |      True | This is an alert3 | eae5d3be-b2b2-40a1-aa28-0412fe9c18e6 | alert3
 2019-10-30 20:10:29.000000+0000 | 2019-10-30 20:10:29.000000+0000 |      True | This is an alert2 | af4ec72f-7758-42ef-b731-8d08f8a00006 | alert2
 2019-10-30 19:10:29.000000+0000 | 2019-10-30 19:10:29.000000+0000 |      True | This is an alert1 | 8b13db5c-9e39-4ee5-90a9-64758c5ab5be | alert1

(3 rows)

不过请注意,您只能对单个聚类键强制执行范围查询,start_date_time如上所示。这行不通:

AND start_date_time >= '2019-10-30 14:10:29'  AND end_date_time <= '2019-10-31 23:59:59';

而且它不起作用,因为Cassandra旨在按顺序从磁盘读取数据和向磁盘写入数据。在单个查询中允许对多列进行范围查询将需要Cassandra进行随机读取,这并不擅长。您可以使用伪指令做到这一点ALLOW FILTERING,但是不建议这样做。虽然,ALLOW FILTERING 较小的分区内使用可能会执行得很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在Java中不允许赋值和不带括号的布尔运算符

来自分类Dev

为什么在is或as运算符的左侧不允许使用lambda和匿名方法?

来自分类Dev

条件运算符不允许程序终止

来自分类Dev

Cassandra NOT EQUAL运算符

来自分类Dev

如何允许用户输入数字和运算符?

来自分类Dev

通过索引位置和比较运算符过滤df

来自分类Dev

Flask-SQLAlchemy过滤器和运算符

来自分类Dev

不允许在C ++中使用多参数运算符[]的根本原因

来自分类Dev

vb.net-为什么ULong(UInt64)不允许+ =运算符?

来自分类Dev

Eclipse中的openjdk 1.7:低于1.7的源级别不允许使用运算符

来自分类Dev

->不允许在C ++中静态分配的对象上使用运算符?

来自分类Dev

OR或IN的操作数中不允许使用外部联接运算符

来自分类Dev

为什么在Typescript中不允许逻辑赋值(&=)运算符?

来自分类Dev

TypeScript不允许算术运算符,但我不明白为什么

来自分类Dev

雄辩的ORM不允许吗?JSONB查找中使用的运算符

来自分类Dev

TypeScript不允许算术运算符,但我不明白为什么

来自分类Dev

文本对象内不允许进行路径构造或图形运算符

来自分类Dev

模块实例化中不允许连接运算符

来自分类Dev

不允许Docker和Nginx操作

来自分类Dev

PHP和.htaccess不允许$ _GET

来自分类Dev

不允许新用户运行Cassandra nodetool命令

来自分类Dev

Cassandra 3.4 Java LIKE运算符

来自分类Dev

Cassandra-CQL OR运算符

来自分类Dev

不允许过滤

来自分类Dev

重载++和+运算符

来自分类Dev

逻辑AND(&&)和OR(||)运算符

来自分类Dev

==和eq运算符

来自分类Dev

StringBuilder和'+'运算符

来自分类Dev

IfElse和OR运算符

Related 相关文章

热门标签

归档