- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 SQL 中相对常见的需求转换为 Cassandra 中的高效数据模型。我正在尝试决定如何最好地对我的数据进行建模,以便我可以按照我希望在应用程序中报告它们的顺序对 Cassandra 中的行进行排序。通常,这对于聚类列来说是一个很好的情况,除了我想要对结果进行排序的数据是一个每天都会更新几次的指标。
我将用 SQL 解释这个问题,然后分享我想到的数据建模方法。我想知道的是,是否有人遇到过与我类似的要求,如果是的话,您是如何在 Cassandra 中对数据进行建模的。
这是我要解决的问题。
假设我有一个像这样定义的 raw_data 表:
CREATE TABLE raw_data (
A varchar,
B varchar,
C varchar,
D varchar,
ts timestamp,
val varint
PRIMARY KEY (ts,A,B,C,D)
);
我还有一个汇总表
CREATE TABLE summary_table (
A varchar,
B varchar,
C varchar,
total_val varint
PRIMARY KEY (A,B,C)
);
我的应用程序以对应于的方式聚合汇总表中的数据
SELECT A, B, C, SUM(val) FROM raw_data GROUP BY A, B, C
我想要做的是执行如下查询:
SELECT B, C, total_val FROM summary_table WHERE A = "Something" ORDER BY total_val DESC LIMIT 1000;
也就是说,我想针对 A 的特定值对汇总表进行子集化,然后返回前 1000 行,按total_val 排序
随着附加数据流入我的 raw_data 表,我的应用程序每隔几分钟就会更新 Total_val。所以我不能使用total_val作为我的数据的聚类列
我想要决定的是如何最好地在 Cassandra 中对此类问题进行建模——其中我需要使用 WHERE 子句对汇总表进行子集化,并对结果集(不断更新)进行排序DESC 顺序。
一些结果集预计会相当大——几十万行(也就是说,我的汇总表中有一些 A 值,SELECT COUNT(*) FROM Summary_table WHERE A = "some value"
将非常非常大,有数十万)。在发送到我的应用程序之前对这些数据进行排序并丢弃显然效率很低。
此外,这似乎不是二级索引的良好用例。在较小的结果集上,它们的性能非常好。对于较大的公司来说,它们是滞后的,我怀疑可能有更好的方法来处理这个问题。
我考虑建模的另一种方法是将较大的结果集缓存到内存中,这样至少在需要对数千行进行排序的地方,我至少会在内存中进行排序。我还考虑过拥有一个辅助汇总表,该表已预先填充了我想要向应用程序公开的前 1000 行...尽管我想不出一种好方法来使这些数据保持最新并避免确切的情况我的原始汇总表也遇到同样的问题。
有没有人遇到过这样的问题,您需要使用 WHERE 子句过滤汇总数据并按 DES 顺序对(经常更改的)结果进行排序?如果是这样,当某些 WHERE 子句返回数千行时,您是否找到了一种方法来提高性能?如果是这样,你是怎么做的?
最佳答案
我能想到的最好方法如下:
CREATE TABLE summary_table (
time_bucket long,
A varchar,
total_val int,
timestamp long,
B varchar,
C varchar,
PRIMARY KEY ((time_bucket, A), total_val, timestamp, B, C)
) WITH CLUSTERING ORDER BY (total_val DESC);
使用此结构,您实际上不会覆盖 total_val
。相反,您为每个新值插入一个新行,然后在查询时丢弃除最新时间戳之外的所有值。 time_bucket
的值应该是您的时间戳,四舍五入到您可以在查询时计算的某个间隔(您可能必须一次查询多个存储桶,但如果可能,请尝试将其限制为仅两个)。如果您想知道,time_bucket
和 A
将成为您的分区键,这可以防止行随时间无限增长。
换句话说,您已将汇总表转换为时间序列数据。如果需要,您可以向旧列添加 TTL,以便它们自然消失。只要您的时间范围合理,您就不会遇到查询大量逻辑删除的问题。
关于cassandra - 在 Cassandra 中高效访问有序结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25872900/
我们有 2 个 cassandra 集群,第一个有旧数据,第二个有新数据。 现在我们想要将旧数据从第一个集群移动或复制到第二个集群。什么是最好的方法来做到这一点以及如何做到这一点? 我们正在使用 DS
我正在考虑安装 OpsCenter 来监控我们在 RackSpace VM 上运行的 24 节点 Cassandra 集群。过去我听说 OpsCenter 减慢了集群速度。我有点担心 OpsCente
假设我有一个复制因子(RF)= 2 的 2 节点集群。 我使用一致性 2 触发插入。当客户端等待响应时,Cassandra 开始写入这 2 个节点。中间一个节点失败,无法完成写入,而另一节点上的写入成
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足 Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以
我在 Cassandra 中有一个表,其中我用 1000 多个条目填充了一些行(每行有 10000 多列)。行中的条目更新非常频繁,基本上只是一个字段(它是一个整数)被更新为不同的值。列的所有其他值保
当Cassandra端有“掉落的突变”时,它是否向调用客户端返回相应的失败?或者即使在服务器端丢弃相应的突变并导致数据丢失,它总是成功响应调用事务的调用客户端? 在一个特定实例中,当我们的 TPS 约
我有一个 Multi-Tenancy 应用程序,其中 tenantId 将成为每个查询的一部分,因此我将其放入所有表的分区键中。 例子: CREATE TABLE users { tenantId t
根据 Datastax 文档,在 Cassandra 中先读后写是一种反模式。 每当我们在 CQLSH 中使用 UPDATE 或使用 Datastax 驱动程序来设置几列(带有 IF 和集合更新)时,
是否有命令或任何方式可以知道 Cassandra 的哪些节点上存储了哪些数据? 我对 Cassandra 很陌生,在谷歌上搜索这个问题并没有多少运气。 谢谢! 最佳答案 您可以使用 nodetool
我们有一个包含 1500 万条记录的表,而我们的表是一个 10 节点的 cassandra 集群。我们有一列有接近 20 个可重复值。是否建议在此列上建立二级索引? 最佳答案 假设在该列上完全均匀分布
Cassandra 发布了它的 technical limitations但没有提到允许的最大列数。是否有最大列数?我需要存储 400 多个字段。这在 Cassandra 中可能吗? 最佳答案 每行的
我想知道当表中有多个非 PK 列时会发生什么。我读过这个例子: http://johnsanda.blogspot.co.uk/2012/10/why-i-am-ready-to-move-to-cq
我有两个关于 Cassandra 查询结果的问题。 当我在 Cassandra 中对表进行“完全”选择(即 select * from table )时,是否保证结果将按分区标记的递增顺序返回? 例如
我无法为 Cassandra 设置 Hector。我已经浏览了 documentation和 Cassandra wiki .这些文档的问题在于,那里的很多信息都已经过时或过时(或者我缺乏知识)。无论
我正在使用 DataStax Enterprise 中 cassandra 中提供的压力测试。如果有人知道的话,我也想要一些关于它和 cassandra 的信息。 - 首先,压力测试使用哪些节点?我的
当我在 CQL 中创建表时,列的顺序是否必须精确 不是 在主键和 中不是 聚类列: CREATE TABLE user ( a ascii, b ascii, c ascii,
我有一张如下表: CREATE TABLE tab( categoryid text, id text, name text, author text, des
我正在尝试学习 Cassandra,但对术语感到困惑。 很多情况下它表示该行存储键/值对。 但是,当我定义一个表时,它更像是声明一个 SQL 表,即;您创建一个表并指定列名和数据类型。 谁能澄清一下?
如何对 cassandra 数据实现审计? 我正在寻找一个开源选项。 cassandra 是否有任何有助于审计的功能? 我可以使用触发器将记录记录到表中吗?我关注了 Triggers示例并且能够将记录
我遇到了一个问题“me.prettyprint.hector.api.exceptions.HUnavailableException:: 可能没有足够的副本来处理一致性级别。”当我有 RF=1 时,
我是一名优秀的程序员,十分优秀!