如何在cassandra中构建范围查询?

2024-03-11

CREATE TABLE users ( 
userID uuid, 
firstname text, 
lastname text, 
state text, 
zip int,
age int,
PRIMARY KEY (userID) 
);

我想构造以下查询:

select * from users where age between 30 and 40

select * from users where state in "AZ" AND "WA"

我知道我需要另外两个表来执行此查询,但我不知道应该如何?

EDIT

从卡洛的评论中,我认为这是唯一的可能性

CREATE TABLE users ( 
userID uuid, 
firstname text, 
lastname text, 
state text, 
zip int,
age int,
PRIMARY KEY (age,zip,userID) 
);

现在选择年龄在 15 到 30 之间的用户。这是唯一的可能性:

select * from users where age IN (15,16,17,....30)

但是,不建议在此处使用 IN 运算符,并且这是反模式。

创建年龄二级索引怎么样?

CREATE index users_age ON users(age)

这会有帮助吗?

Thanks


范围查询是一个棘手的问题。 执行实范围查询的方法是使用复合主键,将范围放在聚类部分上。由于范围位于集群部分,因此您无法执行您编写的查询:你至少需要在整个分区键上有一个相等的条件。 让我们看一个例子:

CREATE TABLE users (
  mainland text,
  state text,
  uid int,
  name text,
  zip int,
  PRIMARY KEY ((mainland), state, uid)
) 

uid 现在是一个 int 只是为了让测试更容易

insert into users (mainland, state, uid, name, zip) VALUES ( 'northamerica', 'washington', 1, 'john', 98100);
insert into users (mainland, state, uid, name, zip) VALUES ( 'northamerica', 'texas', 2, 'lukas', 75000);
insert into users (mainland, state, uid, name, zip) VALUES ( 'northamerica', 'delaware', 3, 'henry', 19904);
insert into users (mainland, state, uid, name, zip) VALUES ( 'northamerica', 'delaware', 4, 'dawson', 19910);
insert into users (mainland, state, uid, name, zip) VALUES ( 'centraleurope', 'italy', 5, 'fabio', 20150);
insert into users (mainland, state, uid, name, zip) VALUES ( 'southamerica', 'argentina', 6, 'alex', 10840);

现在查询可以执行您需要的操作:

 select * from users where mainland = 'northamerica' and state > 'ca' and state < 'ny';

Output

 mainland    | state    | uid | name   | zip
-------------+----------+-----+--------+-------
northamerica | delaware |   3 |  henry | 19904
northamerica | delaware |   4 | dawson | 19910

如果将 int (age, zipcode) 作为聚类键的第一列,则可以执行比较整数的相同查询。

小心:大多数人在看到这种情况时开始思考“好吧,我可以放置一个始终相同的假分区键,然后我可以执行范围查询”。这是一个巨大的错误,分区键负责跨节点的数据分布。设置修复分区键意味着所有数据将在同一节点(及其副本)中完成。

将世界区域划分为 15/20 区域(为了拥有 15/20 分区键)是可以的,但这还不够,只是为了创建一个有效的示例。


编辑:由于问题的编辑

我并没有说这是唯一的可能性;如果您找不到有效的方法来分区users并且需要执行这种查询,这是一种可能性,而不是唯一的一种。应在聚类关键部分上执行范围查询。 AGE 作为分区键的一个弱点是您无法对其执行 UPDATE,任何时候您需要更新用户的年龄时,您都必须执行删除和插入(另一种方法可以是写入birth_year/birth_date 而不是年龄,然后计算客户端)

回答你关于添加二级索引的问题:实际上二级索引的查询不支持IN运算符。从 CQL 消息来看,他们似乎很快就会开发它

错误请求:非主键列 (xxx) 上的 IN 谓词尚未 支持的

然而,即使二级索引支持 IN 运算符,您的查询也不会改变

select * from users where age IN (15,16,17,....30)

只是为了澄清我的概念:任何没有“干净”和“就绪”解决方案的东西都需要用户努力以满足其需求的方式对数据进行建模。举个例子(我并不是说这是一个好的解决方案:我不会使用它)

CREATE TABLE users (
  years_range text,
  age int,
  uid int,
  PRIMARY KEY ((years_range), age, uid)
)

放一些数据

insert into users (years_range, age , uid) VALUES ( '11_15', 14, 1);
insert into users (years_range, age , uid) VALUES ( '26_30', 28, 3);
insert into users (years_range, age , uid) VALUES ( '16_20', 16, 2);
insert into users (years_range, age , uid) VALUES ( '26_30', 29, 4);
insert into users (years_range, age , uid) VALUES ( '41_45', 41, 5);
insert into users (years_range, age , uid) VALUES ( '21_25', 23, 5);

查询数据

select * from users where years_range in('11_15', '16_20', '21_25', '26_30') and age > 14 and age < 29;

output

 years_range | age | uid
-------------+-----+-----
       16_20 |  16 |   2
       21_25 |  23 |   5
       26_30 |  28 |   3

此解决方案可能会解决您的问题,并且可以在小型集群中使用,其中大约 20 个键 (0_5 ...106_110) 可能具有良好的分布。但这一解决方案与之前的解决方案一样,不允许更新并减少了密钥的分发。优点是 IN 集较小。

在 S.I. 已经允许 IN 子句的完美世界中,我将使用 UUID 作为分区键,将years_range(设置为birth_year_range)作为 S.I. 并“过滤”我的数据客户端(如果对 10 > 年龄 > 22 感兴趣,我会要求IN('1991_1995', '1996_2000', '2001_2005', '2006_2010', '2011_2015')计算并删除我的申请中无用的年份)

哈特哈, 卡洛

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在cassandra中构建范围查询? 的相关文章

随机推荐

  • Angular HttpInterceptor 不更改标头

    我编写了一个 Angular 4 3 6 HttpInterceptor 来添加一些标头字段 但是如果我在调试器中检查它们 标头不会更新 任何想法 import Injectable from angular core import Htt
  • python读取大数据的不同方式

    我正在处理大数据 因此找到一种读取数据的好方法非常重要 我只是对不同的阅读方法有点困惑 1 f gzip open file r for line in f process line how can I process nth line c
  • 更改 Flask/Dash 中的图标

    试图获得favicon加载我遵循了互联网上的建议 server Flask name static folder static app dash Dash external stylesheets external stylesheets
  • Jquery 的选择插件,带有链接插件和选择框

    我是新来的 所以这就是问题 我尝试将所选插件 http harvesthq github com chosen 与链接插件 http www appelsiini net projects chained 一起用于我的选择框 但效果不佳 这
  • 如何配置 virtualenvwrapper 与 pyenv 一起使用

    我正在尝试设置我的 imac mavericks 以便能够轻松切换到不同版本的 python 我使用 rbenv 成功地为 Ruby 项目完成了此操作 并发现 pyenv 正是我在这方面所寻找的 我遇到的问题是使用 pyenv 创建虚拟环境
  • 如何在 git 存储库的特定状态下显示文件的内容?

    我想显示 git 存储库特定状态下的路径给出的文件的内容 我没有成功尝试这个 git show f825334150cd4bc8f46656b2daa8fa1e92f7796d Katana source Git GitLocalBranc
  • 如何使用 IEnumerable<> 类型创建 CodeFunction2?

    我确实需要创建如下所示的内容 我正在构建 2 个类 第一个类是名称为 tableNameAsSingular 即 AddressEntity 的类 在我的第二个工作类中 我需要具有如下所示的内容 public IEnumerable
  • 计时器和 JFrame 错误

    我正在制作一个带有计时器和 JFrame 的游戏 以及许多其他东西 但只有这两个会引起问题 在运行下面的片段后 我收到了一个奇怪的错误 至少对于之前从未使用过这些类的我来说是这样 开始执行这个 private static GameView
  • Java 使用 Math.ceil 向上舍入为 int

    int total int Math ceil 157 32 为什么它仍然返回4 157 32 4 90625 我需要四舍五入 我环顾四周 这似乎是正确的方法 I tried total as double输入 但得到 4 0 我究竟做错了
  • 查找一组字符串中 K 个最长的公共后缀

    我想在一组字符串中找到最长的常见后缀 以检测我的自然语言处理项目中的一些潜在的重要语素 给定频率K gt 2 在字符串列表中找到K个最常见的最长后缀S1 S2 S3 SN 为了简化问题 这里举一些例子 Input1 K 2 S firema
  • 确定按下“Backspace”按钮

    How to determine in GWT that user pressed Backspace button I tried this but it does not work Override public void onKeyP
  • zip mime 类型,何时选择哪一种

    到目前为止 对于 Zip 文件的 Mime 类型 我已经看到 应用程序 八位字节流 多部分 x zip 应用程序 zip 应用程序 zip压缩 应用程序 x zip 压缩 我想我的问题是哪个是 最好的 为什么 为什么有这么多选择 我使用 w
  • System.Timers.Timer Elapsed 事件在调用timer.Stop()后执行

    背景 我有一个计时器 用于跟踪自串行端口数据接收事件被触发以来已经过去了多长时间 我正在为此创建自己的解决方案 而不是使用内置的超时事件 因为我正在获取连续的数据流 而不是发送查询并获取一个响应 问题 在 DataReceived 处理程序
  • HTML - 给定一个表格,如何在不破坏布局的情况下允许一列流动

    我有以下内容 div style width 100 table tr td style width 30px hi td td style width 40px hi td td style width 1 LOTS Of text in
  • whitespaceAndNewlineCharacterSet() 中有哪些字符?

    我正在解析一些讨厌的文件 你知道 在一个文件中混合逗号 空格和制表符分隔符单线 然后通过文本编辑器运行它 该编辑器会在第 65 列用 CRLF 换行 啊 作为我在 Cocoa 中解析此内容的努力的一部分 我使用 Apple 的whitesp
  • 验证传递给 Mock 的参数是否按预期设置的正确方法

    如果您稍后验证调用了这些方法 是否可以在回调中进行断言 这是确保我的模拟获得传递给它的预期参数的首选方法 还是应该在回调中设置局部变量并在该实例上执行断言 我遇到的情况是 Presenter 类中有一些逻辑 它根据输入派生值并将它们传递给
  • 在 R 中使用 persp3D 函数时,如何向轴标签添加下标?

    I am trying to define my z axis label as R0 in plot3D below are my code I am using expression for my zlab but I get the
  • 错误:文件已加密或不是数据库

    我使用 PHP 创建了一个带有表的数据库 我通过以下方式做到了 从命令行执行 PHP 文件 php test php 后 我在目录中得到一个名为 test db 的新文件 这就是我想要的 然后 在命令行中 我输入 sqlite3 test
  • em 与 px...针对移动浏览器

    对于桌面浏览器 所有现代浏览器都使用缩放功能 因此我们可以使用 PX 但如果可以在移动设备上看到相同的站点 那么 px 不适合在移动浏览器中缩放 或者使用 px 对于移动浏览器也很好 即使我们不关心 IE 6 如果我们不为移动设备制作不同的
  • 如何在cassandra中构建范围查询?

    CREATE TABLE users userID uuid firstname text lastname text state text zip int age int PRIMARY KEY userID 我想构造以下查询 selec