【发布时间】:2014-01-18 15:53:56
【问题描述】:
我目前正在研究基于抽象数据模型和抽象查询来比较 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 的每个可能组合计算字段“amount”的总和 和 row_name。
在 SQL 中这很容易,只需选择 sum(金额)并按您想要的字段对其进行分组。 但是,由于 Cassandra 不支持这些操作(这很好),我需要以另一种方式实现这一点。
目前,我通过执行全表遍历、处理每条记录并将每个组合的总和存储在 Java 中的 HashMap 中来实现这一点。 我使用的prepared statement如下:
SELECT
partition_key,
financial_institution,
report_name,
view_name,
col_name,
row_name,
amount
FROM allocated;
这部分适用于 cassandra 和 Java 应用程序都具有大量 RAM 的机器,但在较小的机器上会崩溃。
现在我想知道是否有可能以更快的方式实现这一目标? 我可以想象使用 partition_key,它也用作 cassandra 分区键并对每个分区执行此操作(我有 5 个)。
我还考虑通过分配每个分区并报告给单独的线程并并行运行来执行此多线程。但我想这会在应用程序端造成大量开销。
现在回到实际问题:您会推荐另一种执行策略来实现这一目标吗? 可能我还是用类似 SQL 的方式想的太多。
感谢您的支持。
【问题讨论】:
标签: nosql cassandra sum aggregate-functions full-table-scan