我需要在Apache Cassandra中建模和存储财务数据。
数据是按日期和业务单位访问的,所以目前我的模型使用日期和业务单位id作为复合行键。
我想使用宽行,这样我就可以在一个查询中拉取一整天(和单位)的数字。
对于任何给定的一天,对于特定的业务单元,我需要存储一系列越来越细粒度的细分,如下所示(忽略这些数字,它们纯粹是说明性的):
| rowkey | USD | GBP | JPY | etc ....
|-------------|-------|------|------|----------
| 31122014-1 | 112 | 3006 | 234 |
| 31122014-2 | 3378 | -12.4| 998 |
| 31122014-3 | -456 | 2034 | 127 | 然后使用复合列进行更详细的细分:
| rowkey | USD-D1 | USD-D2 | GBP-D1 | GBP-D2 | etc ....
|-------------|--------|--------|--------|------------------
| 31122014-1 | 65 | 54 | 175 | 29 |
| 31122014-2 | 2003 | -6.4 | 603 | 349 |
| 31122014-3 | -230 | -198 | -53 | 217 |然后是更详细的细目:
| rowkey | USD-D1-X1 | USD-D1-X2 | USD-D1-X3 | USD-D2-X1 | etc ....
|-------------|-----------|-----------|-----------|-----------|-------
| 31122014-1 | 23 | 16 | 98 | 29 |
| 31122014-2 | 389 | -3.2 | 237 | 119 |
| 31122014-3 | -105 | -67 | -28 | 178 |这是使用三个独立的柱族(如下所示)对这些分解进行建模的最佳方式吗?
或者,只存储最细粒度的细分,然后使用某种形式的列聚合(如果存在)来提取粒度较小的数据集,是否更有意义?
我知道Cassandra的聚合能力是有限的/不存在的,我还没有在API中找到任何东西来建议如何像这样跨列聚合。
我知道我可以在应用层进行聚合,但接下来的问题是在检索不必要的数据、移动计算开销和维护额外的列族之间的权衡。我希望Cassandra能提供一些在数据层解决这个问题的方法。
发布于 2015-02-09 11:04:03
根据您想要的数据建模方式,您可以
的一部分
例如:如果根据您的数据模型,如果行键访问总是包含一个货币,那么您可以这样建模
| rowkey |currency|
|---------------|--------|
| 31122014-1,GBP| 112 |显然,这将更好地分散单个行键的数据,但会增加行键的数量
在选择其中一个策略之前,请考虑以下几点
a. Distribution of the rows across nodes
b. Sparse columns vs wide columns
c. Effects on row cache (if you are going to turn it on) and key cache
d. And the most important, your selection queries发布于 2015-02-11 07:18:53
我认为你的解决方案很可能是有效的。对于Cassandra,根据您期望对其运行的查询,在多个位置存储多个数据通常更好。
如果您将这些用例中的每一个都看作是将在不同时间查询的三个单独的用例,那么您就有了一个可靠的数据模型。
不管它有什么价值,这个用例很好地发挥了CQL的优势,它将如下建模:
CREATE TABLE finance0 (
day DATE,
unit INT,
currency TEXT,
amount BIGINT,
PRIMARY KEY ((day, unit) currency)
);
CREATE TABLE finance1 (
day DATE,
unit INT,
currency TEXT,
sorter1 TEXT,
amount BIGINT,
PRIMARY KEY ((day, unit) currency, sorter1)
);
CREATE TABLE finance2 (
day DATE,
unit INT,
currency TEXT,
sorter1 TEXT,
sorter2 TEXT,
amount BIGINT,
PRIMARY KEY ((day, unit) currency, sorter1, sorter2)
);https://stackoverflow.com/questions/28401479
复制相似问题