我目前正在研究一个基准测试(这是我的学士论文的一部分),它基于抽象数据模型和抽象查询比较 SQL 和 NoSQL 数据库,以在所有系统上实现公平实施。
我目前正在执行如下指定的查询:我在 Cassandra 中有一个表,指定如下:
CREATE TABLE allocated(
partition_key int,
financial_institution varchar,
primary_uuid uuid,
report_name varchar,
view_name varchar,
row_name varchar,
col_name varchar,
amount float,
PRIMARY KEY (partition_key, report_name, primary_uuid));
该表包含大约 100,000,000 条记录 (~300GB)。
我们现在需要为report_name、view_name、col_name和row_name的每个可能组合计算字段“数量”的总和。
在 SQL 中,这很容易,只需选择 sum(金额)并按您想要的字段对其进行分组。但是,由于 Cassandra 不支持这些操作(这非常好),我需要以另一种方式实现这一点。
目前,我通过执行全表遍历、处理每条记录并将每个组合的总和存储在 Java 中的 HashMap 中来实现这一点。我使用的准备好的语句如下:
SELECT
partition_key,
financial_institution,
report_name,
view_name,
col_name,
row_name,
amount
FROM allocated;
这部分适用于 cassandra 和 Java 应用程序具有大量 RAM 的机器,但在较小的机器上会崩溃。
现在我想知道是否有可能以更快的方式实现这一目标?我可以想象使用 partition_key,它也用作 cassandra 分区键并为每个分区执行此操作(我有 5 个)。
我也想通过分配每个分区并报告给一个单独的线程并并行运行它来完成这个多线程。但我想这会在应用程序方面造成很多开销。
现在回到实际问题:您会推荐另一种执行策略来实现这一目标吗?也许我仍然以类似 SQL 的方式思考太多。
感谢您的支持。