gpt4 book ai didi

cassandra - 在 Cassandra 中高效访问有序结果

转载 作者:行者123 更新时间:2023-12-03 06:56:53 24 4
gpt4 key购买 nike

我正在尝试将 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_bucketA 将成为您的分区键,这可以防止行随时间无限增长。

换句话说,您已将汇总表转换为时间序列数据。如果需要,您可以向旧列添加 TTL,以便它们自然消失。只要您的时间范围合理,您就不会遇到查询大量逻辑删除的问题。

关于cassandra - 在 Cassandra 中高效访问有序结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25872900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com