cassandra - 如何减少或是否有必要减少 Cassandra 中大量数据的分区数?
问题描述
我估计约 5 亿行数据和 500 万个唯一数字。我的查询必须通过number
and获取数据event_date
。number
作为分区键,将有 500 万个分区。我认为在查询过程中存在很多小分区和超时是不好的。我在定义分区键时遇到了麻烦。我找到了一些合成分片策略,但无法应用于我的模型。我可以通过 mod 号定义分区键,但是行在分区之间不是分布平衡的。
我如何对此进行建模以减少或是否有必要减少分区数?有分区数限制吗?
CREATE TABLE events_by_number_and_date (
number bigint,
event_date int, /*eg. 20200520*/
event text,
col1 int,
col2 decimal
PRIMARY KEY (number, event_date)
);
解决方案
对于您的查询,数据模型的更改将无济于事,因为您正在使用不适合 Cassandra 的查询。尽管 Cassandra 支持聚合,例如 max、count、avg、sum 等,但它们是为在单个分区内工作而设计的,而不是为在整个集群中工作而设计的。如果不限制分区键,协调节点发出它们,需要到达集群中的每个节点,并且它们将需要遍历集群中的所有数据。
您仍然可以执行此类查询,但最好使用 Spark 之类的工具来执行此操作,因为它针对并行数据处理进行了高度优化,并且Spark Cassandra 连接器能够正确执行数据查询。如果你不能使用 Spark,你可以实现你自己的全令牌范围扫描,使用类似于this的代码。但无论如何,不要期望会有一个“实时”的答案(< 1sec)。
推荐阅读
- apache-nifi - 如何重试 InvokeHTTP 处理器特定的时间
- javascript - 如何在使用 chai-http 测试 Node.js 端点时模拟函数
- javascript - 不和谐机器人回复每个前缀 discord.js
- discord.js - 使用 presentUpdate 侦听器选择退出 Discord.JS 机器人的问候的命令
- android - 如何推迟从 Compose TextField 更新到 Firebase,直到用户输入 ImeAction.Done
- javascript - 在不使用库 Angular 12 的情况下获取未来 90 天的日期对象
- python - 如何使用 Selenium 通过 OnClick Javascript 更改日历中的日期并抓取相关信息?
- javascript - 如何为apache Echart包装雷达图的长点标签?
- r - 在 r 中加入两个 data.tables:删除重叠重复项,同时在每个单独的数据集中保留重复项
- spring - 如何映射不相关的 JPA 实体